1. Schéma du modèle de mémoire JVM
La zone de données d'exécution JVM (JVM Runtime Area) fait en fait référence à la division et à l'allocation de l'espace mémoire JVM pendant l'exécution de la JVM. Deux images trouvées sur Internet sont les suivantes (je pense personnellement que la deuxième image Native Method Stack devrait être dessinée dans le module Java Thead) :
2. Introduction à chaque zone de données
1. Zone Pile
La pile est divisée en pile de machines virtuelles Java et locale pile de méthodes
Le point clé est lapile de machine virtuelle Java, qui est threadprivée et a le même cycle de vie que le thread.
Chaque exécution de méthode créera un cadre de pile , qui est utilisé pour stocker table de variables locales, pile d'opérations, lien dynamique, sortie de méthode , etc. . Chaque méthode est appelée jusqu'à ce qu'elle soit exécutée. Correspond au processus par lequel un cadre de pile est poussé dans la pile jusqu'à être retiré de la pile dans la machine virtuelle.
La pile fait généralement référence à la partie de table de variables locales, qui stocke les 8 types de données de base connus lors de la compilation, ainsi que les références d'objets et les adresses d'instructions. La table des variables locales est allouée lors de la compilation Lors de la saisie d'une méthode, la taille mémoire allouée aux variables locales dans cette pile est déterminée.
Il y aura deux exceptions : StackOverFlowError et OutOfMemoneyError. Lorsque la profondeur de la pile de requêtes de thread est supérieure à la profondeur autorisée par la machine virtuelle, une erreur StackOverFlowError est générée ; la pile de la machine virtuelle est développée dynamiquement et lorsque l'expansion ne peut pas s'appliquer à suffisamment d'espace mémoire, une erreur OutOfMemoneyError est générée.
La pile de méthodes locales sert les méthodes locales (natives) utilisées par la machine virtuelle et est également privée de thread .
2. Zone du tas
Le tas est une zone partagée par tous les threads et est créé lorsque la machine virtuelle démarre, dont le seul but est de stocker des instances d'objets .
La zone tas est la zone principale de gc. Elle est généralement divisée en deux blocs, la jeune génération et l'ancienne génération. Pour être plus détaillé, la jeune génération est divisée en zone Eden où les objets nouvellement créés sont stockés. Du survivant et Au survivant enregistrent les objets qui ont survécu au gc. Par défaut, chacun représente 8:1:1.
Cependant, de nombreux articles présentent qu'elle est divisée en 3 blocs et que la zone de méthode est comptée comme la génération permanente. Ceci est probablement basé sur la division des machines virtuelles Hotspot et, par exemple, IBM j9 n'a pas d'introduction à la génération permanente. Quel que soit le degré de partitionnement, les instances d'objet sont stockées.
Il y aura une exception OutOfMemoneyError
Zone de méthode
La zone est partagée par tous les threads et est utilisée pour stocker les informations de classe, les constantes, les variables statiques et d'autres données qui ont été chargées par la machine virtuelle . Décrit par la machine virtuelle Java comme une partie logique du tas. Il est d'usage de l'appeler aussi la génération permanente
La collecte des déchets visite rarement cette zone, mais elle doit également être recyclée, principalement pour le recyclage constant de la piscine et le déchargement de type.
Le pool constant est utilisé pour stocker divers bytecodes et références de symboles générés pendant le temps de compilation Le pool constant a un certain degré de dynamique. . Les constantes générées lors de la compilation peuvent y être stockées ; les constantes pendant l'exécution peuvent également être ajoutées au pool de constantes, comme la méthode inn() de string.
4. Compteur de programme
Le numéro de ligne exécuté par le courant Indicateur de fil . Déterminez l'instruction suivante en modifiant la valeur du compteur, comme les boucles, branches, sauts, gestion des exceptions, récupération de thread, etc. qui reposent tous sur des compteurs pour terminer .
Le multithreading des machines virtuelles Java est implémenté en changeant de thread à tour de rôle et en allouant du temps d'exécution du processeur. Pour que la commutation des threads revienne à la bonne position, chaque thread nécessite un compteur de programme indépendant, il est donc privé du thread.
La seule machine virtuelle Java ne spécifie aucun bloc OutofMemoryError
Résumé de la zone de données
Nom |
Caractéristiques |
Fonction
|
Paramètres de configuration |
Exception |
Compteur de programme |
Occupe une petite mémoire, le thread privé, le cycle de vie est le même que celui du thread |
Indicateur de numéro de ligne à peu près bytecode
|
Aucun |
Aucun |
Pile de machines virtuelles |
Thread privé, le cycle de vie est le même que celui du thread, Utiliser l'espace mémoire continu |
Modèle de mémoire pour l'exécution de méthodes Java, stockant les tables de variables locales, les piles d'opérations, les liens dynamiques, les sorties de méthode et d'autres informations
|
-Xss |
StackOverflowError
OutOfMemoryError
|
tas Java |
Partage de threads, le cycle de vie est de la même manière que la machine virtuelle, vous pouvez enregistrer des instances d'objet sans utiliser d'adresses mémoire consécutives |
Toutes les instances d'objet (y compris les tableaux) doivent être allouées sur le tas <.> |
-Xms-Xsx-Xmn
|
OutOfMemoryError
|
Zone Méthode
|
Partage de thread, le cycle de vie est le même que celui de la machine virtuelle, vous ne pouvez ne pas utiliser d'adresses mémoire continue
| Données de stockage telles que les informations de classe, les constantes, les variables statiques, le code compilé par un compilateur juste à temps qui ont été chargés par la machine virtuelle
|
-XX:PermSize:16M-XX:MaxPermSize:64M
|
OutOfMemoryError
|
Pool de constantes d'exécution
|
Partie de la zone de méthode, dynamique
|
Stockage des littéraux et des références de symboles
|
|
|
4. Extension : Mémoire directe
Mémoire directe (Direct Mémoire) ne fait pas partie de la zone de données d'exécution de la machine virtuelle et n'est pas une zone de mémoire définie dans la spécification de la machine virtuelle Java, mais cette partie de la mémoire est également fréquemment utilisée et peut également provoquer des exceptions OutOfMemoryError, nous l'expliquerons donc ici.
La classe NIO (NewInput/Output) a été récemment ajoutée au JDK 1.4, et une méthode d'E/S basée sur Channel et Buffer a été introduite, qui peut être allouée directement à l'aide de la bibliothèque de fonctions natives Mémoire hors tas, puis opérer via un objet DirectByteBuffer stocké dans le tas Java comme référence à cette mémoire. Cela peut améliorer considérablement les performances dans certains scénarios, car cela évite de copier des données entre le tas Java et le tas natif.
5. Extension : comparaison du tas et de la pile
Certaines personnes divisent souvent la mémoire Java en mémoire tas (Heap) et en mémoire pile (Stack). la division est en réalité bien plus compliquée que cela. La popularité de cette méthode de division montre seulement que les zones de mémoire auxquelles la plupart des programmeurs accordent le plus d'attention et qui sont les plus étroitement liées à l'allocation de mémoire des objets sont ces deux zones.
Le tas est flexible, mais pas sûr. Pour les objets, nous devons les créer et les détruire dynamiquement. Nous ne pouvons pas dire que les objets créés ultérieurement ne sont pas détruits, et les objets créés précédemment ne peuvent pas être détruits. Dans ce cas, notre programme sera difficile à exécuter, donc le tas est utilisé. pour stocker des objets en Java. Une fois l'objet dans le tas détruit, si nous continuons à référencer cet objet, la fameuse NullPointerException se produira. C'est le défaut du tas - une logique de référence incorrecte ne sera découverte qu'au moment de l'exécution.
La pile n'est pas flexible, mais elle est stricte, sûre et facile à gérer. Car tant que la référence supérieure n'est pas détruite, la référence inférieure doit toujours être là. Dans la plupart des programmes, les variables et références définies en premier sont poussées sur la pile, et celles définies ultérieurement sont poussées sur la pile. et les références à l'intérieur du bloc sont stockées dans la zone d'entrée lorsqu'un bloc est poussé sur la pile et lorsqu'un bloc se termine, il est retiré de la pile. En comprenant ce mécanisme, nous pouvons facilement comprendre le concept de portée dans diverses programmations. En même temps, c'est aussi l'avantage de la pile : une logique de référence incorrecte sera perdue lors de la compilation et pourra être découverte à tout moment.
Stack : stocke principalement les références et les types de données de base.
Heap – utilisé pour stocker les instances d'objet produites par new.
Référence :
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!