Cet article présente principalement l'explication détaillée de la distribution de la mémoire lorsque le programme Java est en cours d'exécution. Les amis qui en ont besoin peuvent se référer à
Distribution de la mémoire Java : La machine virtuelle Java aura la mémoire. gère est divisé en plusieurs zones de données différentes : zone de méthode, pile de machine virtuelle, pile de méthodes locale, tas et compteur de programme.
1. Compteur de programme
Le compteur de programme est un petit espace mémoire Il peut être considéré comme un indicateur de numéro de ligne du bytecode exécuté par le thread actuel. Dans le modèle conceptuel de la machine virtuelle, l'interpréteur de bytecode fonctionne en modifiant la valeur de ce compteur pour sélectionner une instruction de bytecode qui doit être exécutée.
Les fonctions de base telles que le branchement, le bouclage, le saut, la gestion des exceptions et la récupération de threads dépendent toutes de ce compteur pour être exécutés.
Afin de restaurer la position d'exécution correcte après le changement de thread, chaque thread doit avoir un compteur de programme indépendant. Les compteurs entre chaque thread ne s'affectent pas et sont stockés indépendamment, ce type de zone mémoire est donc. Mémoire "Thread privé".
Si le thread exécute une méthode Java, ce compteur enregistre l'adresse de l'instruction de bytecode de la machine virtuelle en cours d'exécution ; si le thread exécute une méthode native, la valeur du compteur est vide et cette zone est la mémoire. seul domaine dans lequel la spécification de la machine virtuelle Java ne spécifie aucune condition OutOfMemoryError.
2. Pile de machines virtuelles Java
Comme le compteur de programme, la pile de machines virtuelles Java est également privée de thread et son cycle de vie est le même que celui de le fil. La pile de machine virtuelle décrit le modèle de mémoire d'exécution de la méthode Java ; lorsque chaque méthode est exécutée, un cadre de pile est créé pour stocker des informations telles que des tables de variables locales, des piles d'opérandes, des liens dynamiques, des sorties de méthode, etc.
Chaque méthode, de l'invocation à la fin de l'exécution, correspond au processus de poussée d'un cadre de pile dans et hors de la pile de machines virtuelles.
La table de variables locales stocke divers types de données de base, des références d'objet (non équivalentes à des objets, mais des références à des objets) et des types returnAddress connus au moment de la compilation. Si la profondeur de pile demandée par le thread est supérieure à la profondeur autorisée par la machine virtuelle, une exception StackOverflowError sera levée. Si une mémoire suffisante ne peut pas être demandée, une exception OutOfMemory sera levée.
3. Pile de méthodes locales
La différence entre la pile de méthodes locales et la pile de machines virtuelles est que la pile de machines virtuelles sert le Java (bytecode) exécuté par le machine virtuelle et la pile de méthodes locale sert les méthodes natives utilisées par la machine virtuelle.
4. Java Heap
Le tas Java est une zone mémoire partagée par tous les threads et est créée au démarrage de la machine virtuelle. Le seul but de cette zone mémoire est de stocker les instances d'objets. Le tas Java est la zone principale gérée par le garbage collector
5 La zone méthode
La zone méthode. est identique au tas Java. Il s'agit d'une zone mémoire partagée par chaque thread et utilisée pour stocker des données telles que des informations de classe, des constantes, des variables statiques et du code compilé par le compilateur juste à temps qui ont été chargés par le tas Java. machine virtuelle.
6. Pool de constantes d'exécution
Le pool de constantes d'exécution fait partie de la zone des méthodes. En plus des informations de description de la version de la classe, des champs, des méthodes, des interfaces, etc., le fichier Class dispose également d'un pool de constantes, qui est utilisé pour stocker divers littéraux et références de symboles générés lors de la compilation. chargé dans la classe. Ensuite, il est stocké dans le pool de constantes d'exécution dans la zone des méthodes.
De nombreuses explications sur les pools constants sur Internet utiliseront des chaînes comme exemples :
Par exemple,
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo"; String s4 = "Hel" + new String("lo"); String s5 = new String("Hello"); String s6 = s5.intern(); String s7 = "H"; String s8 = "ello"; String s9 = s7 + s8; System.out.println(s1 == s2); // true System.out.println(s1 == s3); // true System.out.println(s1 == s4); // false System.out.println(s1 == s9); // false System.out.println(s4 == s5); // false System.out.println(s1 == s6); // true
s1==s2 est vrai , ce qui est facile à comprendre. Pointe vers l'adresse mémoire du même pool constant.
s1==s3 est vrai : pour s3, puisque toutes les concaténations sont des littéraux, le compilateur optimisera, ce qui signifie en fait s3="Bonjour"
s1== s4 est faux : depuis nouveau String("lo") n'est pas un littéral, mais une variable, le compilateur ne l'optimisera pas car la variable peut changer.
s1==s9 est faux : le même que ci-dessus.
s4==s5 : Les références de deux objets différents sont bien entendu différentes.
s1==s6 : Puisque la méthode String.intern() signifie : si le pool de constantes contient déjà une chaîne égale à cet objet String (l'objet est représenté par est égal à (Object ) méthode détermine), puis la chaîne dans le pool est renvoyée. Sinon, cet objet String est ajouté au pool et une référence à cet objet String est renvoyée. Il s'ensuit que pour deux chaînes s et t, s.intern() == t.intern() est vrai si et seulement si s.equals(t) est vrai.
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!