JVM, à propos des connaissances de base de JVM, es-tu sûr de ne pas le savoir ?

Table des matières

1. Le concept de JVM

Que sont les JVM ?

2. Processus d'exécution de la JVM

1. Comment le fichier de classe est chargé et exécuté par la JVM

2. Quelles zones sont incluses dans les données d'exécution JVM (M)

3. Le processus de chargement de classe (M)

4. Modèle de délégation parentale

1. Analyse du modèle de délégation parentale

2. Quels chargeurs de classe existe-t-il dans JAVA (M)

5. Mécanisme de collecte des ordures

1. Identification des objets morts

① Algorithme de comptage de référence

②Algorithme d'analyse d'accessibilité

 Que sont les GC Roots ?

Les racines GC ont généralement les types suivants :

2. Algorithme de collecte des ordures

①Algorithme de suppression de marque

②Marquer l'algorithme de copie

③ Algorithme de marquage

 Le processus de collecte des ordures? (M)

1. GC mineur (ramassage des ordures de la nouvelle génération)

 2.Full GC (ramassage des ordures dans la vieillesse)

3. Collecteur d'ordures

Présentez le Garbage Collector (M)

 Les principaux éboueurs sont les suivants :


1. Le concept de JVM

Que sont les JVM ?


JVM est l'abréviation de Java Virtual Machine (Java Virtual Machine).JVM est une spécification pour les dispositifs informatiques.C'est un ordinateur fictif qui est réalisé en simulant diverses fonctions informatiques sur un ordinateur réel . 

2. Processus d'exécution de la JVM

1. Comment le fichier de classe est chargé et exécuté par la JVM

①Lorsqu'un fichier .java est compilé dans un fichier .class, le fichier .class sera chargé dans le sous-système de chargement de classe, puis le sous-système de chargement de classe chargera le fichier dans la zone de données d'exécution

②Dans la zone de données d'exécution, l'objet de classe est chargé dans la zone de méthode, de sorte que l'objet d'instance nouvellement créé peut créer un nouvel objet via ce modèle d'objet de classe.

③L'objet d'instance créé sera chargé dans le tas

④Pile de machine virtuelle : chaque thread ouvrira un espace dans la pile de machine virtuelle, et chaque fois qu'une méthode est appelée, la méthode sera poussée dans la pile, ce qui signifie que chaque pile stocke le niveau des appels de méthode

⑤ Pile de méthode locale : de même, chaque thread ouvrira une partie de la mémoire dans la pile de méthode locale, et chaque fois qu'une méthode locale est appelée, la méthode locale sera chargée dans la pile de méthode locale.

⑥Compteur de programme : enregistrez l'adresse de l'instruction à laquelle le thread actuel s'exécute : en considérant que la machine virtuelle Java change de thread à tour de rôle et alloue des tranches de temps en mode multi-thread, lorsque la tranche de temps allouée par un certain thread est épuisée. Cependant , lorsque le thread en cours n'a pas fini de s'exécuter, il est nécessaire d'utiliser le compteur de programme pour enregistrer l'adresse de l'instruction à laquelle le thread en cours s'exécute. Lorsque le thread en cours est à nouveau alloué à la tranche de temps, il continuera à s'exécuter à partir de la consigne en cours.

2. Quelles zones sont incluses dans les données d'exécution JVM (M)

① Zone de méthode : avant JDK1.7, la zone de méthode s'appelait également la génération permanente, et après 1.8, elle s'appelait le métaspace. La différence réside dans les différentes méthodes d'implémentation. La zone de méthode est l'endroit où l'objet de classe est stocké lorsqu'il est chargé dans la JVM, l'objet de classe est stocké dans la zone de méthode de sorte que lorsqu'un objet d'instance doit être créé ultérieurement, il peut directement obtenir et créer un objet d'instance à partir de l'objet de classe dans la zone de méthode. Il convient de noter que la zone de méthode est partagée par tous les threads

②Heap : les objets d'instance créés seront chargés dans l'espace de tas, et la taille de l'espace de tas peut être définie via des paramètres dans la JVM : Xms10 (espace mémoire de tas minimum) consiste à définir la taille de l'espace de tas, et Xmx10 (espace de tas maximum espace mémoire) est également défini Taille de l'espace de tas : nous définissons généralement ces deux paramètres de mémoire sur la même taille. Nous définissons généralement les deux paramètres sur l'espace de tas maximum que le thread peut consommer. Si l'espace mémoire est relativement petit, des erreurs OOM peuvent se produire ( OUT OF MEMORY ERROR), une fois que cette erreur se produit, nous pouvons définir l'espace de tas pour qu'il soit plus grand.

③pile de la machine virtuelle Java : chaque thread ouvrira un espace dans la pile de la machine virtuelle. La taille de la capacité de la pile de la machine est généralement déterminée par le paramètre Xss. Si la pile déborde, une erreur StackOverFlow sera signalée.

④Pile de méthode native : de même, chaque thread ouvrira un morceau de mémoire dans la pile de méthode locale, et chaque fois qu'une méthode locale est appelée, la méthode locale sera chargée dans la pile de méthode locale.

⑤Compteur de programme : enregistre l'adresse de l'instruction à laquelle le thread actuel s'exécute : en considérant que la machine virtuelle java change de thread à tour de rôle et alloue des tranches de temps en mode multi-thread, lorsque la tranche de temps allouée par un thread est épuisée. Cependant, lorsque le thread en cours n'a pas fini de s'exécuter, il est nécessaire d'utiliser le compteur de programme pour enregistrer l'adresse de l'instruction à laquelle le thread en cours s'exécute. Lorsque le thread en cours est à nouveau alloué à la tranche de temps, il continuera à s'exécuter à partir du instruction.

3. Le processus de chargement de classe (M)

1. charge

Charger tous les fichiers .class dans la machine virtuelle

2. Vérification

Vérifier le fichier actuel selon la spécification du fichier .class

3. Préparez

Initialisez différents types de valeurs aux valeurs par défaut, int est initialisé à 0, float est initialisé à 0.0f. …

4. Analyse

Remplacez la référence symbolique du pool constant dans la machine virtuelle Java par une référence directe , qui est le processus d'initialisation du pool constant. (Par exemple : la chaîne dans le pool de constantes d'origine n'est pas directement référencée (il s'agit toujours d'un espace réservé). Dans ce processus, une nouvelle chaîne sera créée et l'espace réservé dans le pool de constantes sera remplacé)

 

5. Initialisation

Le travail précédent est un travail préparatoire. Cette étape consiste à exécuter le code Java dans la classe. Après cette étape, le véritable objet Java sera créé.

4. Modèle de délégation parentale

1. Analyse du modèle de délégation parentale

Différentes classes utilisent différents chargeurs de classe lors du chargement :

 La stratégie de son chargeur de classe est la suivante : lors de la création d'une classe, elle remonte d'abord applicationClassLoader vers BootStrapClassLoader. BootStrapClassLoader vérifie si cette classe existe dans son propre chemin de chargement, la charge si elle existe et la transmet vers ExtClassLoader si elle ExtClassLoader recherche cette classe dans son propre chemin de chargement, la charge si elle existe et la transmet à ApplicationClassLoader si ce n'est pas le cas, trouve et charge cette classe dans son propre chemin

2. Quels chargeurs de classe existe-t-il dans JAVA (M)

5. Mécanisme de collecte des ordures

1. Identification des objets morts

① Algorithme de comptage de référence

Concept : Lorsqu'un objet est référencé, le nombre de références est augmenté de 1. Lorsque l'objet référencé est 0, l'objet est marqué comme objet mort et l'objet doit être recyclé.

Le schéma est le suivant :

 Analyse de processus : lorsque deux objets sont créés, deux variables sont définies pour pointer vers les deux objets créés. A ce moment, les références des deux objets sont +1. En même temps, l'attribut d'instance de l'objet est également utilisé pour pointent vers les deux objets créés. À ce moment, les décomptes de références des deux objets nouvellement créés sont tous deux 2, mais si ces deux variables sont définies sur vide, le décompte de références des deux objets nouvellement créés est -1, mais puisque les deux variables sont vides, les deux L'attribut d'instance de la variable ne peut plus accéder à ces deux objets, mais comme le compteur de références de ces deux objets n'est pas devenu 0 (l'attribut d'instance pointe toujours vers les deux objets), ces deux objets ne peuvent pas être recyclé, ce qui signifie causé une fuite de mémoire

remarques : fuite de mémoire : fuite de mémoire (fuite de mémoire) fait référence à la mémoire de tas qui a été allouée dynamiquement dans le programme n'est pas libérée ou ne peut pas être libérée pour une raison quelconque, entraînant un gaspillage de mémoire système, entraînant de graves conséquences telles que le ralentissement réduire la vitesse d'exécution du programme ou même planter le système.

Le problème de fuite de mémoire n'est pas facile à trouver lorsque le programme commence à s'exécuter. Lorsque le programme s'exécute pendant un certain temps, de nouveaux objets sont continuellement placés dans l'espace du tas et ne peuvent pas être effacés à temps, ce qui entraînera éventuellement l'espace du tas. être plein et faire planter le programme.

②Algorithme d'analyse d'accessibilité

Le principe de mise en œuvre de l'algorithme d'analyse d'accessibilité est le suivant : rechercher de haut en bas selon la relation de référence à partir des racines GC (ensemble de nœuds de départ), et le chemin de recherche est appelé [chaîne de référence]. Si un résultat n'atteint aucune racine chaîne de référence d'objet, l'objet est dit inaccessible, indiquant que l'objet est inaccessible.


Lors de la récupération de place, il recherchera d'abord tous les nœuds racine [énumérer les nœuds racine], puis effectuera une recherche de haut en bas à partir de ces nœuds racine. Ce processus doit suspendre le thread utilisateur, c'est-à-dire déclencher STW, et l'objet peut être trouvé et expliqué. Réservé, et si l'objet ne peut pas être recherché, il sera récupéré à l'aide de l'algorithme de récupération de place.

 Que sont les GC Roots ?

GC Roots est également un objet, et c'est un objet que la JVM ne doit pas recycler. Lorsque la JVM exécute GC, elle exécute d'abord STW après que tous les utilisateurs atteignent le point de sécurité, suspend les threads de tous les utilisateurs, puis énumère les nœuds racine , puis Rechercher de haut en bas.

Les racines GC ont généralement les types suivants :

1. L'objet référencé par l'attribut statique dans la zone de méthode est
une sorte d'objet global. L'objet Class lui-même est difficile à recycler et les conditions de recyclage sont très strictes. Tant que l'objet Class n'est pas recyclé, le les membres statiques ne peuvent pas être recyclés.

2. Les objets référencés par le pool de constantes dans la zone de méthode
sont également des objets globaux, tels que le pool de constantes de chaîne.La constante elle-même ne changera pas après l'initialisation, il est donc raisonnable d'être GC Roots.

3. L'objet référencé par la table des variables locales du cadre de pile dans la pile de méthodes
appartient à l'objet dans le contexte d'exécution. Lorsque le thread exécute la méthode, il empaquette la méthode dans un cadre de pile et l'exécute sur la pile. les variables utilisées dans la méthode seront stockées dans le cadre de la pile dans la table des variables locales. Tant que la méthode est toujours en cours d'exécution et n'a pas été extraite de la pile, cela signifie que l'objet dans la table des variables locales sera toujours accessible et que le GC ne doit pas recycler, donc ce type d'objet peut également être utilisé comme Racines GC.

4. Les objets référencés dans la pile de méthodes locales JNI
sont essentiellement les mêmes que les précédents, sauf que l'un est une référence de variable dans la pile de méthodes Java et l'autre est une référence de variable dans la méthode native (C, C++) empiler.

5. Objets détenus par
des verrous de synchronisation Les objets verrouillés par synchronized ne peuvent jamais être récupérés.S'il existe un thread détenant un verrou d'objet, si le GC recycle l'objet, le verrou deviendra invalide.

2. Algorithme de collecte des ordures

①Algorithme de suppression de marque

Idée d'algorithme : marquez les objets indisponibles dans tous les objets actuels, marquez-les en place, puis effacez-les

Défauts : Mais les défauts de cet algorithme sont également évidents : la suppression des objets inutilisables in situ générera un grand nombre de fragments d'espace libre discontinus. Si vous devez créer des objets plus grands à ce moment mais que l'espace libre continu actuel n'est pas satisfait, le prochain la collecte des ordures doit être déclenchée.

 

②Marquer l'algorithme de copie

Idée d'algorithme : Divisez tout l'espace disponible en deux parties, telles que l'espace 1 et l'espace 2. Après avoir effacé les objets inutilisables dans l'espace 1, il existe un grand nombre de fragments d'espace libre discontinu. Les objets disponibles et indisponibles sont triés et disposés, et l'espace 1 est dégagé dans son ensemble une fois le tri terminé, et cette opération est répétée lors d'un nouveau dégagement ultérieur

Défaut : Le défaut de cet algorithme est également relativement évident. Dans chaque processus de récupération de place, seule la moitié de l'espace peut réellement jouer un rôle.

③ Algorithme de marquage

L'idée de l'algorithme est la suivante : trier tous les objets après avoir effacé à chaque fois certains objets indisponibles

Défaut : un tri est nécessaire pour chaque dégagement, et l'efficacité de l'algorithme est relativement faible

 Le processus de collecte des ordures? (M)

 Différents objets de classe sont divisés en générations et tous les objets de classe sont divisés en nouvelle génération et ancienne génération. Parmi eux, la nouvelle génération occupe 1/3 de l'espace de tas, l'ancienne génération occupe 2/3 de l'espace de tas et la L'espace de nouvelle génération est toujours Il y a 1/5 survivants (les survivants sont divisés en de et vers deux zones). Les objets sont traités par générations et la récupération de place est divisée en deux types : ①Minor GC (récupération de place de nouvelle génération) ②Full GC (Major GC/Full GC se produit dans la récupération de place de l'ancienne génération).

1. GC mineur (ramassage des ordures de la nouvelle génération)

Le ramasse-miettes de la nouvelle génération utilise l'algorithme de copie (car les objets de la nouvelle génération itèrent fréquemment, un algorithme avec une efficacité relativement élevée est nécessaire. Bien que copie consomme une grande quantité d'espace, son efficacité est relativement élevée ). le processus est le suivant :


① Lors de la création d'un objet, créez-le directement dans la zone Eden. À ce moment, les deux zones du survivant sont vides (rapport de la taille de l'espace : Eden : de : à = 8 : 1 : 1).

②Lorsque nous créons à nouveau un objet et constatons que la capacité actuelle de la zone Eden n'est pas suffisante pour stocker l'objet actuel, les objets de la zone Eden seront jugés et traités, et les objets déterminés comme morts seront effacés, et les objets survivants seront déplacés vers la zone de départ dans la zone de survivant, "l'âge" de l'objet déplacé vers la zone de départ +1 ;

③La zone Eden continue de créer de nouveaux objets, et après avoir effacé les objets non référencés, tous les objets survivants de la zone Eden sont déplacés vers la zone de départ, et la zone Eden et la zone de départ sont entièrement occupées. Les objets survivants sont déplacés vers la zone de destination, puis la zone d'Eden et la zone de départ sont nettoyées, et l'âge des objets placés dans la zone de départ au tour précédent est augmenté de 1

⑤Lors du prochain tour de GC, les positions de la zone de départ et de la zone de destination seront échangées. À ce moment, la zone de destination est vide, et la zone de provenance et la zone d'Eden continueront à participer au prochain tour de GC, en répétant les étapes ci-dessus

⑥ Après un GC continu, l'âge des objets de la nouvelle génération atteint un certain seuil (le seuil par défaut est de 15), à ce moment ces objets doivent être déplacés vers l'ancienne génération

 Résumé : Jetons un coup d'œil à l'ensemble du processus de traitement des ordures de nouvelle génération : à chaque tour de GC, de nouveaux objets seront créés dans la zone Eden. Lorsque la capacité restante de la zone Eden n'est pas suffisante pour créer de nouveaux objets, tout Eden The les objets survivants dans la zone sont déplacés vers la zone de. Au prochain tour de GC, tous les objets survivants dans les zones de départ et d'Eden seront copiés dans la zone de destination, toutes les zones de départ et d'Eden seront effacées, et le La zone de destination et la zone de départ seront remplacées pour continuer la collecte des ordures.

 2.Full GC (ramassage des ordures dans la vieillesse)

La stratégie de récupération de place de l'ancienne génération n'utilise pas l'algorithme de copie, mais l'algorithme de marquage. Étant donné que les objets entrant dans l'ancienne génération ne sont pas fréquemment créés et détruits par rapport à la nouvelle génération, il est plus approprié d'utiliser l'algorithme de marquage. Le GC complet est beaucoup plus lent que le GC mineur, donc dans le processus de réglage de la JVM, une grande partie du travail consiste à ajuster le GC complet

3. Collecteur d'ordures

Présentez le Garbage Collector (M)

Avant de parler du ramasse-miettes, parlons du processus de développement du ramasse-miettes : étant donné que STW est exécuté pendant le processus de ramasse-miettes, tous les threads utilisateur doivent suspendre les services de thread pendant ce processus, donc raccourcir le temps STW est inutile. L'objectif que le le collecteur doit poursuivre après avoir satisfait aux exigences commerciales. Au début, un ramasse-miettes à un seul thread était utilisé.Avec l'expansion continue de l'échelle du programme et l'enrichissement continu du contenu du programme, le ramasse-miettes à un seul thread ne pouvait pas répondre aux besoins des utilisateurs, et le ramasse-miettes à plusieurs threads Avec le développement continu du programme, le temps de STW multi-thread devient de plus en plus long, et un nouveau ramasse-miettes est lancé pour raccourcir le temps de STW

 Les principaux éboueurs sont les suivants :

  • Collecteur série (algorithme de copie)
    Collecteur monothread de nouvelle génération, le marquage et le nettoyage sont monothread, l'avantage est simple et efficace. Il s'agit de la méthode GC par défaut au niveau du client, qui peut être -XX:+UseSerialGCspécifiée de force.
  • Serial Old collector (algorithme de classement des marques)
    Collecteur monothread ancienne génération, l'ancienne version du collecteur Serial.
  • Le collecteur de nouvelle génération du collecteur ParNew (algorithme d'arrêt de copie) 
    peut être considéré comme une version multithread du collecteur Serial, qui offre de meilleures performances que Serial dans un environnement CPU multicœur.
  • Collecteur de récupération parallèle (algorithme d'arrêt de copie)
    Collecteur parallèle, poursuivant un débit élevé et une utilisation efficace du processeur. Le débit est généralement de 99 % et le débit = temps de thread utilisateur/(temps de thread utilisateur + temps de thread GC). Il convient aux applications d'arrière-plan et à d'autres scénarios qui ne nécessitent pas de réponse d'interaction élevée. C'est la méthode GC par défaut au niveau du serveur, qui peut être utilisée -XX:+UseParallelGCpour forcer la spécification et -XX:ParallelGCThreads=4pour spécifier le nombre de threads.
  • Ancien collecteur parallèle (algorithme d'arrêt de copie)
    L'ancienne version du collecteur Parallel Scavenge, un collecteur parallèle, avec priorité de débit.
  • Le collecteur CMS (Concurrent Mark Sweep) (algorithme de nettoyage des marques)
    a une simultanéité élevée et de faibles pauses, et poursuit le temps de pause de récupération du GC le plus court. L'utilisation du processeur est relativement élevée, le temps de réponse est rapide et le temps de pause est court. Les processeurs multicœurs sont le choix pour poursuivre un temps de réponse élevé.

Je suppose que tu aimes

Origine blog.csdn.net/m0_65431718/article/details/130295744
conseillé
Classement