Maison  >  Article  >  Java  >  Analyse du code Java sur la mémoire du programme

Analyse du code Java sur la mémoire du programme

Y2J
Y2Joriginal
2017-05-03 15:14:281201parcourir

Cet article présente principalement des informations pertinentes sur l'analyse de la mémoire du programme en Java. Les amis qui en ont besoin peuvent s'y référer

Cet article expliquera brièvement la JVM (Java Virtual Machine) lorsque nous exécutons un programme Java. .machine) allocation de mémoire.

Tout d'abord, apprenons à connaître quelques noms de manière perceptuelle :

Pile De manière générale, les types de données de base sont directement dans. L'espace est alloué sur la pile, et les variables locales (variables définies dans le segment de code de la méthode) sont également directement allouées sur la pile. Lorsque la méthode où se trouve la variable locale est exécutée, l'espace est immédiatement récupéré par la JVM. également un type de données de référence, à savoir Ce que nous appelons habituellement la référence correspondant à l'objet qui doit être créé à l'aide du mot-clé new se trouve également dans l'espace de pile. A ce moment, la JVM alloue un espace d'adressage à la référence d'objet dans la pile. espace (équivalent à un numéro de maison, grâce à ce numéro de maison, vous pouvez trouver votre maison par numéro), allouer un espace dans l'espace de tas pour l'objet référencé, et la référence d'adresse dans l'espace de pile pointe vers la zone d'objet dans l'espace de tas (trouver l'adresse grâce au numéro de la maison);

2. Le tas est généralement utilisé pour stocker les données obtenues à l'aide du mot-clé new.

Ensuite, nous utiliserons un programme pour ressentir intuitivement la situation de la mémoire de la JVM lorsque le programme est en cours d'exécution

package demo;
public class Student {
  private String name;
  private int age;

  public void study() {
    System.out.println("I love study!");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}
package demo;

public class StudentDemo {
  public static void main(String[] args) {
    Student student = new Student();

    System.out.println(student.getName() + ":" + student.getAge());
    student.setName("John");
    student.setAge(23);
    System.out.println(student.getName() + ":" + student.getAge());
    
    student.study();
    
    Student student2 = student;
    student2.setName("Jack");
    student2.setAge(25);
    System.out.println(student2.getName() + ":" + student2.getAge());
    System.out.println(student.getName() + ":" + student.getAge());
  }
}

Lorsque nous exécuterons le programme, la JVM se combinera. la classe Student et StudentDemo La classe est compilée puis chargée dans un endroit appelé zone de méthode dans la JVM. Les variables membres et les méthodes membres de la classe sont également chargées dans la zone de méthode. À ce stade, le modèle de mémoire est le suivant.

Vous pouvez voir qu'il y a une marque hexadécimale sur le côté droit de la méthode d'étude, mais pas les variables de nom et d'âge. C'est parce que chaque objet a le sien. variables membres, mais les méthodes membres de la classe peuvent être partagées par chaque objet Afin d'économiser de l'espace mémoire, la JVM alloue cette marque (également appelée adresse mémoire) à la méthode pour faciliter la recherche et l'appel de chaque nouvel objet. Ensuite, la JVM recherchera automatiquement la méthode principale et demandera un espace dans la pile pour la méthode principale. Ce processus est également appelé Push it on the stack, puis exécutera la 5ème ligne de code dans notre classe Student. , la JVM alloue un morceau de mémoire à l'objet Student dans l'espace du tas et lui attribue une adresse mémoire (si la variable membre de l'objet n'a pas de valeur, la JVM attribuera une valeur à la variable Attribuer une valeur initiale) , allouez un espace mémoire dans la pile pour pointer vers l'adresse mémoire de la zone d'objet Student dans l'espace du tas. À ce stade, le modèle de mémoire est le suivant

Ensuite. regardez la section de code Aux lignes 8 et 9, le programme attribue des valeurs aux variables membres de l'objet étudiant. La JVM recherchera les variables de la classe Student dans la mémoire tas en fonction de l'adresse pointée par l'étudiant, et attribuez de nouvelles valeurs aux variables

Ligne 12, à ce moment l'objet étudiant appelle la méthode d'étude, et la JVM demande un espace mémoire dans l'espace de pile pour la méthode d'étude

La méthode d'étude est exécutée Après cela, l'espace de pile est libéré immédiatement Dans la ligne 14 du code, la référence de l'objet student2 pointe vers le. adresse pointée par l'étudiant

Les lignes 15 et 16 du code attribuent des valeurs aux variables de student2 Puisque student2 et student pointent vers le même endroit, la valeur de. la variable dans l'objet étudiant est également modifiée à ce moment

À ce stade, tout le code de la méthode principale a été exécuté et la méthode principale L'espace de pile occupé est également recyclé et l'espace du tas attend le recyclage GC

Les résultats de l'exécution du code sont les suivants :

null:0
John:23
I love study!
Jack:25
Jack:25

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