Maison  >  Article  >  Java  >  Types de mémoire en Java

Types de mémoire en Java

王林
王林original
2024-08-30 15:17:29308parcourir

La zone mémoire de la machine virtuelle Java est une zone d'exécution utilisée pour l'exécution de divers programmes impliqués lors de l'exécution d'une application Java. La zone mémoire de la JVM est largement divisée en cinq parties différentes qui sont la zone de méthode, la zone de tas, Pile, zone d'enregistrement du compteur de programme (PC) et zone de méthode native. Dans cet article, nous aborderons les différents types de mémoire en Java.

PUBLICITÉ Cours populaire dans cette catégorie MAÎTRISÉE JAVA - Spécialisation | 78 séries de cours | 15 tests simulés

Top 5 des types de mémoire en Java

Comme nous savons que Java est un langage orienté objet ; par conséquent, tous les objets créés en Java sont stockés dans JVM (Java virtual machine). La mémoire JVM est essentiellement divisée en les parties suivantes :

1. Zone de méthode

Tous les threads en cours d'exécution partagent cette partie de la zone mémoire JVM. Éléments de classe tels que le pool constant, les champs de classe, les codes de constructeur, les codes de méthode, etc. La zone de méthode peut être considérée comme une partie de la zone de tas mais stocke uniquement les données par classe. Nous pouvons dire que la zone méthode est responsable de la conservation des informations au niveau de la classe.

2. Mémoire de tas

La mémoire tas en Java est utilisée par le runtime Java pour allouer de la mémoire aux objets et aux classes lors de l'exécution d'un programme Java. Chaque fois qu'un objet est créé en Java, il est stocké dans la mémoire tas. Un processus de garbage collection s'exécute sur la mémoire du tas pour libérer de l'espace inutile. Le garbage collection supprime les objets de la zone du tas qui n'ont aucune référence. La mémoire tas en Java est divisée en parties suivantes :

  • Jeune génération : C'est la partie où sont placés tous les objets nouvellement créés. Lorsque cette partie du tas Java est remplie, un garbage collection mineur se produit pour libérer de l'espace.
  • Ancienne génération : Tous les objets laissés en mémoire après un ramasse-miettes mineur sont déplacés vers l'ancienne génération. C'est donc la partie de la mémoire tas où sont présents les objets à longue durée de vie.
  • Génération permanente : Cette partie de JVM contient des méthodes natives et statiques qui fournissent des métadonnées pour exécuter des applications Java.

Voici quelques points importants concernant la mémoire de tas Java :

  • Si l'espace du tas est plein, une erreur OutOfMemory est générée par Java.
  • L'accès à la mémoire Heap est lent par rapport à la mémoire pile.
  • La mémoire tas est beaucoup plus grande en taille que la mémoire pile.
  • La mémoire tas n'est pas thread-safe car tous les objets la partagent.
  • La désallocation automatique n'est pas présente dans la mémoire tas car elle nécessite un ramasse-miettes pour libérer de l'espace.

3. Mémoire de pile

Comme son nom l'indique, la mémoire de pile est basée sur le principe LIFO (dernier entré, premier sorti). La mémoire de pile est utilisée pour l'allocation de mémoire statique et chaque thread en cours d'exécution dans un programme Java possède sa propre mémoire de pile. Chaque fois qu'une méthode Java est appelée, un nouveau bloc est créé dans la mémoire de la pile Java pour contenir les variables locales ou intermédiaires et les références à d'autres objets de la méthode. Dès que l'exécution de la méthode est terminée, le bloc de mémoire dans la pile devient vide et est utilisé par la méthode suivante. La taille de la mémoire Stack est inférieure à celle de la mémoire tas. Voici quelques-unes des fonctionnalités importantes de la mémoire de pile.

  • La mémoire de pile augmente et diminue à mesure que de nouvelles méthodes sont ajoutées et supprimées pour empiler la mémoire, respectivement.
  • La mémoire de la pile est automatiquement allouée et libérée une fois l'exécution de la méthode terminée.
  • L'accès à la mémoire de pile est rapide par rapport à la mémoire de tas.
  • Chaque fois que la mémoire de la pile est pleine, une exception appelée exception de débordement de pile est levée par Java.
  • La mémoire de pile est thread-safe car chaque thread possède sa propre mémoire de pile.

4. Registres PC

La fonction principale des registres PC est de stocker l'adresse de l'instruction en cours d'exécution. Il stocke également l'adresse des threads responsables de l'exécution de l'instruction en cours. La taille de la mémoire allouée aux registres PC est très petite. Les applications Java exécutées dans JVM n'ont aucun effet sur la mémoire du registre du PC ou sur son contenu.

5. Zone natale

Cette zone est implémentée en utilisant des langages autres que Java. Lors de la création de nouveaux threads, de la mémoire est allouée dans cette zone pour chaque thread créé. La taille de la zone native peut être fixe ou dynamique.

Exemples de mémoire en Java

Nous allons maintenant voir un exemple Java montrant comment la mémoire est allouée :

Code :

package com.edubca.javademo;
class StudentData {
int rollNumber;
String name;
public StudentData(int rollNumber, String name) {
super();
this.rollNumber = rollNumber;
this.name = name;
}
public int getRollNumber() {
return rollNumber;
}
public void setRollNumber(int rollNumber) {
this.rollNumber = rollNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
int id = 11;
String name = "Yash";
StudentData s = null;
s = new StudentData(id, name);
System.out.println("Student Id is " + s.getRollNumber());
System.out.println("Student Name is " + s.getName());
}
}

Sortie :

Types de mémoire en Java

Allocation de mémoire :

Nous allons maintenant voir comment la mémoire est allouée dans le programme ci-dessus :

  • Dans la classe Main, après avoir entré la méthode main, puisque id, le nom est des variables locales, un espace dans la mémoire de la pile est créé de la manière suivante :
    • L'identifiant entier ayant une valeur primitive sera stocké dans la mémoire de la pile.
    • La référence des objets StudentData est stockée dans la mémoire de pile pointant vers l'objet StudentData d'origine, qui est stocké dans la mémoire tas.
  • L'appel au constructeur de classe StudentData sera ajouté en haut de la mémoire de la pile. Les éléments suivants seront stockés :
    • Référence à l'objet appelant.
    • Identifiant de variable entière ayant la valeur 11.
    • Référence du nom de la variable de type String qui pointera vers un objet réel stocké dans un pool de chaînes en mémoire tas.
  • Deux variables d'instance portant le nom studentId et studentName déclarées dans la classe StudentData seront stockées dans la mémoire tas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Outils de déploiement JavaArticle suivant:Outils de déploiement Java