Ce que cet article vous apporte, c'est l'analyse (images et textes) de la zone mémoire JVM et du garbage collection. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
1. Introduction à JVM
JVM, le nom complet est Java Virtual Machine, qui est une machine virtuelle Java. Applications écrites en Java en tant que langage de programmation exécuté sur la JVM. JVM est une spécification pour les appareils informatiques. Il s'agit d'un ordinateur fictif implémenté en simulant diverses fonctions informatiques sur un ordinateur réel. Une caractéristique très importante de Java est son indépendance par rapport à la plate-forme, et la JVM est la clé pour réaliser cette fonctionnalité.
L'exécution du programme par la JVM est principalement divisée en deux étapes. La première étape est la compilation, c'est-à-dire que le fichier source .java est compilé dans un fichier de bytecode .class. La JVM interprète le fichier de code d'octets pour l'interprétation et l'exécution. Les organigrammes en deux étapes sont présentés respectivement dans les deux figures suivantes :
2. Zone mémoire JVM
L'ensemble du système JVM est divisé en deux sous-systèmes. Le premier est ClassLoader, qui est le chargeur de classe. Sa fonction est de charger la classe écrite dans la JVM. Le second est le moteur d'exécution, qui est le moteur d'exécution, chargé d'interpréter et d'exécuter les fichiers de bytecode compilés. Le moteur d'exécution mentionné ci-dessus est divisé en deux parties. La première partie est la zone de données d'exécution, qui est la zone de données d'exécution, qui équivaut à la mémoire de la JVM. La deuxième partie est l'interface native, qui est l'interface de localisation. , qui est principalement utilisé pour exécuter d’autres programmes non Java. Programme écrit dans un langage de programmation.
Le point clé est l'ancienne zone de données d'exécution, qui est divisée en cinq parties, à savoir la zone de méthode (zone de méthode), le tas (tas), la pile de VM (pile de machine virtuelle), le registre de compteur de programme (compteur de programme ), Pile de méthodes natives. Les deux premiers threads sont partagés et les trois derniers sont isolés. Comme le montre la figure ci-dessous :
En résumé, la JVM allouera la zone de méthode et le tas lors de sa première exécution. rencontre un thread, il alloue le registre du compteur de programme (compteur de programme), la pile de machine virtuelle (pile de machine virtuelle) et la pile de méthodes natives (pile de méthodes locale). Lorsque le thread se termine, les trois (pile de machine virtuelle, pile de méthodes locales) La mémoire). l'espace occupé par la pile de méthodes et le compteur de programme) sera également libéré. C'est également la raison pour laquelle la zone de données est divisée en partage de threads et isolation de threads. Le cycle de vie des trois zones isolées de threads est le même que celui du thread auquel elles appartiennent, et la zone partagée des threads est la même que celle du thread partagé. cycle de vie du programme Java en cours d'exécution, il s'agit donc également d'un déchet système. La raison pour laquelle le recyclage se produit uniquement dans la zone partagée par les threads (en fait, pour la plupart des machines virtuelles, il se produit sur le tas). L'exception de débordement de mémoire est illustrée dans la figure ci-dessous :
1. Zone de méthode (zone de méthode)
La zone méthode comprend un pool constant et des champs statiques. Stocke les informations de la classe chargée (nom, modificateurs, etc.), les variables statiques de la classe, les constantes de la classe, les informations de champ de la classe et les informations de méthode de la classe. Lorsque les développeurs obtiennent des informations dans le programme via des méthodes telles que getName et isInterface dans l'objet Class, ces données proviennent de la zone de méthode.
2. Heap (Heap)
Le tas est le plus grand morceau de mémoire géré par la JVM Presque toutes les instances d'objets et les tableaux se trouvent dans cette zone. par new en Java sont La mémoire des objets est allouée ici et la mémoire des objets dans le tas doit attendre que le GC soit recyclé.
3. Registre du compteur de programme (compteur de programme)
Le compteur de programme est un petit espace mémoire C'est l'indicateur du numéro de ligne du bytecode exécuté par le thread actuel. fonctionne, il sélectionne la prochaine instruction de bytecode à exécuter en modifiant la valeur du compteur. Les fonctions de base telles que les branches, les sauts et les boucles dépendent toutes de lui pour être implémentées.
4. Pile de machine virtuelle (Virtual Machine Stack)
La pile de machine virtuelle décrit le modèle de mémoire de l'exécution de la méthode Java. Chaque méthode créera un cadre de pile (Stack Frame) lors de son exécution. frame est utilisé pour stocker des tables de variables locales (types de données de base, références d'objets, etc.), des piles d'opérandes, des liens dynamiques, des adresses de retour de méthode et quelques informations supplémentaires supplémentaires.
5. Pile de méthodes natives
Cette zone joue un rôle très similaire à la pile de machines virtuelles, sauf que la pile de machines virtuelles sert à la machine virtuelle pour exécuter les méthodes Java, et la méthode native La stack sert les méthodes natives du système d’exploitation (Native) utilisées.
3. Collecte des ordures JVM
Le principe GenerationalCollecting (garbage collection) de JVM est de diviser les objets en jeune génération (Young), ancienne génération (Tenured) et génération persistante (Perm), et d'utiliser différents algorithmes pour les objets avec différents cycles de vie.
Habituellement, le recyclage de la mémoire JVM fait toujours référence au recyclage de la mémoire Heap (heap). En effet, seul le contenu du Heap (heap) est alloué dynamiquement, donc la jeune génération et l'ancienne génération des objets ci-dessus font référence à la JVM. L'espace du tas (tas), et la génération persistante est la zone de méthode (zone de méthode) mentionnée précédemment, qui n'appartient pas au tas (tas).
1. Jeune génération
Lorsqu'une application Java alloue des objets Java, ces objets seront alloués à l'espace tas de la jeune génération
Cet espace est principalement constitué de petits objets et sera recyclé fréquemment
Étant donné que la collecte des ordures de l'espace de tas de la jeune génération sera très fréquente, son algorithme de collecte des ordures accordera plus d'attention à l'efficacité du recyclage
2 . Ancienne génération
Les objets à longue durée de vie dans l'espace de tas de la jeune génération seront transférés (peut-être de façon permanente) vers l'espace de tas de l'ancienne génération
Cet espace de tas est généralement plus grand que L'espace de tas de la jeune génération est grand et son taux de croissance de l'espace est lent
Étant donné que la majeure partie de l'espace de tas JVM est allouée à l'ancienne génération, son algorithme de récupération de place doit être plus d'espace -économie, et cet algorithme doit être capable de gérer un espace de tas à faible densité de déchets
3 La génération persistante
stocke les métadonnées de la VM et Classes Java, ainsi que la statique des chaînes et des classes internes Variable
Lorsque l'espace du tas de ces trois générations est restreint ou qu'il n'y a pas assez d'espace à allouer pour de nouvelles requêtes, le mécanisme de récupération de place prendra effet. Il existe deux types de garbage collection : Minor GC et Full GC. Lorsque l’espace de tas de la jeune génération est plein, une collection sera déclenchée pour déplacer les objets survivants vers l’espace de tas de l’ancienne génération. Lorsque l'espace du tas d'ancienne génération est plein, une collection complète couvrant toute la plage du tas d'objets sera déclenchée.
Il s'agit d'une brève analyse de la zone mémoire JVM et du garbage collection, à titre de référence uniquement.
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!