Qu'est-ce que JVM (Java Virtual Machine)?
--JVM est une abréviation de Java Virtual Machine, qui est un logiciel requis pour exécuter des programmes Java.
- L'entité qui peut exécuter le code de morsure Java.
Il peut être exécuté quel que soit le type de CPU ou d'OS.
En d'autres termes, dans le processus qui s'exécute sur l'OS, le code d'octet obtenu en compilant le code Java est converti en un langage machine que l'OS correspondant (Windows, OS X, Linux, etc.) peut comprendre (analyser) et exécuter.
JVM pour divers OS
Configuration JVM
Si vous regardez les choses en gros, il y a les quatre suivantes.
- Class Loader
- Execution Engine
- Garbage Collector
- Runtime Data Area
Configuration JVM
Class Loader
En Java, lorsque vous créez un code source, un fichier .java est généré comme Test.java.
Lorsque le compilateur Java compile la source java, un fichier .class (code d'octet) comme Test.class est généré.
Le chargeur de classe assume le rôle d'assembler le ** fichier de classe généré de cette manière et de charger la ** zone de données d'exécution **, qui est la zone de mémoire donnée par le système d'exploitation.
Execution Engine
- Le moteur d'exécution convertit la classe (code d'octet) chargée par Class Loader en langage machine et l'exécute en unités de mots de commande.
--Il existe deux façons d'utiliser une expression d'interpréteur qui exécute les mots de commande un par un et un compilateur JIT (Just-In-Time).
- Le compilateur JIT est une méthode pour améliorer les performances en changeant le code d'octet entier en code natif à un moment approprié et en exécutant le code compilé nativement par Execution Engine.
Garbage Collector
- Le Garbage Collector (GC) recherche et supprime les objets non référencés parmi les objets créés (chargés) dans la zone de mémoire du tas.
--Je ne sais pas exactement quand le GC aura lieu. (Parce que nous ne pouvons pas garantir qu'il sera publié immédiatement après la disparition de la référence)
- Pendant l'exécution du GC, les threads autres que le thread qui exécute GC s'arrêteront.
- Si tous les threads sont arrêtés pendant quelques secondes lorsque Full GC est exécuté, un problème fatal pouvant entraîner un échec se produira.
Runtime Data Area
- Cette zone est utilisée pour charger les données utilisées lors de l'exécution des applications Java dans la zone mémoire de la JVM.
- Divisé en zone de méthode, zone de tas, zone de pile, registre PC, pile de méthode native. (Il y a d'autres représentants.)
Structure de la zone de données d'exécution
Method area
--La zone de méthode est une zone où les informations de classe sont gérées pour chaque classe utilisée dans le programme.
- Informations de champ et noms de méthode tels que les noms de variables de membre de classe, les types de données, les informations de contrôleur d'accès, les types de retour, les paramètres, les informations de type (interface ou classe), le pool de constantes, les variables statiques, les variables de classe finales, etc. Est géré.
Heap area
-
La zone de tas est la zone qui gère l'instance et les champs membres de l'instance.
-
Zone de gestion des objets et des tableaux créés avec le nouveau mot-clé.
-
Seule la classe chargée dans la zone de méthode peut être générée, et le garbage collector analyse et libère la mémoire non référencée.
Stack area
- Ceci est la zone pour chaque fil.
- Zone de gestion des variables locales, des paramètres, des valeurs de retour, des valeurs arbitraires utilisées dans les opérations, etc.
- La zone de pile n'est pas une ressource partagée, elle est donc thread-safe.
--Le cadre de la pile est divisé en trois sous-entrées.
- Stocke le nombre de variables locales associées à la méthode Local Variable Array et leurs valeurs correspondantes.
--Pile d'opérandes Si une opération intermédiaire est requise pour s'exécuter, la pile d'opérandes fonctionne comme un espace de travail d'exécution (espace de travail) pour exécuter l'opération.
- Tous les symboles correspondant à la méthode FrameData sont stockés ici. Dans le cas d'exceptions, les informations de bloc catch sont conservées dans les données de trame.
PC Register
- Contient un compteur de programme, un pointeur vers l'instruction en cours d'exécution dans un thread, dans la zone créée à chaque fois qu'un thread est créé. (* Différent des registres CPU)
- Si la méthode en cours d'exécution est "native", la valeur du registre du compteur de programme ne sera pas définie.
Native method stack
- Une zone de mémoire pour le code natif écrit dans des langages de programmation autres que Java.
- Habituellement, une pile pour utiliser du code tel que C / C ++. (JNI)
- JNI: JNI interagit avec la bibliothèque de méthodes native et fournit la bibliothèque native requise pour le moteur d'exécution.
Lorsque le fil est créé
Tous les threads partagent la zone de méthode et la zone de tas
La zone de pile, les registres PC et la pile de méthodes natives sont créés pour chaque thread et ne sont pas partagés.
Heap area & Garbage Collector
Dans cet article, la zone Heap est une cible importante de GC, alors regardons de plus près.
(La zone de pile et la zone de méthode sont également soumises à GC.)
La zone Heap se compose de 5 zones (eden, survivor1, survivor2, old, permanent).
Jusqu'au JDK7, la zone permanente existait en tas. A partir de JDK8, la zone permanente a disparu et une partie de celle-ci a été transformée en "zone de méta-espace". (La figure ci-dessus est basée sur JDK7.) La zone de méta-espace est maintenant incluse dans la zone de pile native.
(Il est important que les chiffres de la zone des survivants n'aient pas de sens et soient divisés en deux.)
La raison pour laquelle la zone Heap est divisée en 5 est que GC fonctionne efficacement.
Je voudrais expliquer les détails en regardant le processus de GC.
GC est divisé en GC mineur et GC majeur
* GC mineur: GC effectué dans la nouvelle zone
- Lorsque l'objet est créé pour la première fois, il sera créé dans la zone Eden.
- Le premier GC est fait lorsque la zone Eden est pleine d'objets.
- La mémoire de la zone Eden est copiée dans la zone survivor1 telle quelle. Supprimez ensuite les objets dans les autres zones sauf la zone survivor1.
- Lorsque la zone Eden et la zone survivant1 sont pleines, recherchez les objets créés dans la zone Eden et les objets générés dans la zone survivant1 référencés.
- Laissez les objets non référencés tels quels et copiez uniquement les objets référencés dans la zone survivor2.
- Supprimez les objets dans les autres zones à l'exception de la zone survivor2.
- Les objets qui sont référencés plus d'un certain nombre de fois dans le flux ci-dessus sont déplacés de la zone survivor2 vers l'ancienne.
- Répétez le flux ci-dessus et passez à Old en continu avant que la zone survivor2 ne soit pleine.
* GC majeur (GC complet): GC effectué dans l'ancienne zone
- Inspectez tous les objets de la zone Ancien pour voir s'ils sont référencés.
- Collectez les objets non référencés et supprimez-les tous à la fois.
- Cela prend plus de temps que le GC mineur et tous les threads sauf GC sont arrêtés pendant l'exécution du GC.
Et si le GC majeur (GC complet) est terminé? ??
Vérifie les objets non référencés dans la zone Ancien et supprime tous les objets applicables.
Dans ce cas, il sera supprimé dans la zone de mémoire du tas et de l'espace mémoire libre sera créé, mais une reconfiguration est effectuée pour éliminer cette mémoire libre. (Organisation de la mémoire)
** Ainsi, tous les threads sont arrêtés pour empêcher d'autres threads d'utiliser la mémoire lors de la reconfiguration de la mémoire. ** **
référence
- https://jeong-pro.tistory.com/m/148?category=793347
- https://gakumon.tech/java/java_thread_jvm.html