Maison  >  Article  >  Java  >  Quel est le mécanisme de récupération de place de JVM ?

Quel est le mécanisme de récupération de place de JVM ?

青灯夜游
青灯夜游original
2023-02-01 14:02:2611974parcourir

Le mécanisme de garbage collection de jvm est GC (Garbage Collection), également appelé garbage collector. Principes de base du GC : recyclez les objets qui ne sont plus utilisés en mémoire ; la méthode utilisée pour le recyclage dans le GC est appelée le collecteur. Étant donné que le GC nécessite des ressources et du temps, Java analyse les caractéristiques du cycle de vie de l'objet et utilise les objets. collectés dans la nouvelle génération et l’ancienne génération pour raccourcir autant que possible la pause provoquée par GC dans l’application.

Quel est le mécanisme de récupération de place de JVM ?

L'environnement d'exploitation de ce tutoriel : système windows7, version java8, ordinateur DELL G3.

Qu'est-ce que le garbage collection

L'un des avantages de Java par rapport aux langages C et C++ est qu'il est livré avec un garbage collector. Le garbage collection fait référence au nettoyage des objets inaccessibles dans la mémoire tas de temps en temps. Les objets inaccessibles ne seront pas recyclés immédiatement. L'exécution du garbage collector dans un programme Java est automatique et ne peut pas être forcée. La seule chose que le programmeur peut faire est de suggérer l'exécution du garbage collector en appelant la méthode System.gc. mais on ne sait pas s’il peut être exécuté et quand il le sera. C’est aussi le principal inconvénient du garbage collector. Bien entendu, cette lacune est compensée par la grande commodité qu’elle apporte aux programmeurs.

Pourquoi le garbage collection est nécessaire

Si le garbage collection n'est pas effectué, la mémoire sera consommée tôt ou tard car nous allouons constamment de l'espace mémoire sans le recycler. A moins que la mémoire ne soit infinie, on peut l’allouer arbitrairement sans la recycler, mais ce n’est pas le cas. La collecte des déchets est donc nécessaire.

Principe du garbage collection jvm

Il y a une zone de tas dans la zone de données d'exécution de la JVM, et le tas est un énorme pool d'objets. Un grand nombre d'instances d'objets sont gérées dans ce pool d'objets, et certains des niveaux de référence des objets du pool sont très profonds. Une interface fréquemment appelée génère des objets à un rythme très élevé par seconde. Dans le même temps, la relation entre les objets forme un immense réseau.

Java a créé une atmosphère de mémoire infinie, mais les objets ne peuvent pas seulement augmenter sans diminuer, donc le garbage collection est nécessaire ; alors comment la JVM détermine-t-elle quels objets doivent être recyclés ? Lesquels faut-il conserver ? Cela nécessite l'utilisation du mécanisme de garbage collection de la JVM, que nous appelons souvent GC (Garbage Collection), également appelé garbage collector.

Le principe de base du GC (Garbage Collection) : recycler les objets qui ne sont plus utilisés en mémoire. La méthode utilisée pour le recyclage dans GC est appelée un collecteur Puisque le GC a besoin de consommer des ressources et du temps, Java utilise Après avoir analysé la vie. Caractéristiques du cycle des objets, les objets sont collectés selon les méthodes de nouvelle génération et d'ancienne génération pour raccourcir autant que possible la pause provoquée par GC à l'application

● La collection d'objets de nouvelle génération est appelée GC mineure
● La collection des objets de l'ancienne génération est appelé Full GC
● Le GC forcé en appelant activement System.gc() dans le programme est Full GC

Différents types de références d'objets, GC utilisera différentes méthodes pour recycler, les objets JVM Les références sont divisées en quatre types :
● Référence forte : Par défaut, les objets utilisent des références fortes (les instances de cet objet ne sont pas référencées par d'autres objets et seront recyclées uniquement dans GC)
● Référence douce : La référence douce est la clé en Java Elle fournit une application qui est plus adapté aux scénarios de mise en cache (il ne sera GCé que lorsque la mémoire n'est pas suffisante)
● Référence faible : Elle sera définitivement recyclée par GC lors du GC
● Référence virtuelle : Parce que la référence virtuelle n'est utilisée que pour savoir si le l'objet est GC

L'objet est marqué comme une méthode poubelle

La structure de mémoire de la JVM comprend cinq zones principales : 程序计数器虚拟机栈本地方法栈堆区方法区. Parmi elles, les trois zones du compteur de programme, de la pile de machines virtuelles et de la pile de méthodes locales naissent et sont détruites avec le thread. Par conséquent, l'allocation de mémoire et le recyclage de ces zones sont déterministes et il n'est pas nécessaire de considérer le problème du recyclage. trop, car Lorsque la méthode se termine ou que le thread se termine, la mémoire sera naturellement recyclée. La zone de tas Java et la zone de méthode sont différentes. L'allocation et le recyclage de cette partie de la mémoire sont dynamiques, c'est sur quoi le garbage collector doit se concentrer.

1. Compteur de références

Le comptage de références est une des premières stratégies du garbage collector. Dans cette approche, chaque instance d'objet dans le tas a un décompte de références. Lorsqu'un objet est créé, l'instance d'objet est affectée à une variable et le nombre de variables est défini sur 1. Lorsqu'une référence à cet objet est affectée à une autre variable, le décompte est augmenté de 1 (a = b, puis le compteur de l'instance d'objet référencée par b + 1), mais lorsqu'une référence d'une instance d'objet dépasse le cycle de vie ou est défini sur Lorsqu'une nouvelle valeur est atteinte, le compteur de référence de l'instance d'objet est décrémenté de 1. Toute instance d'objet avec un compteur de référence de 0 peut être récupérée. Lorsqu'une instance d'objet est récupérée, le compteur de références de toute instance d'objet qu'elle référence est décrémenté de un.

Avantages : Le collecteur de comptage de références peut être exécuté rapidement et est étroitement lié au fonctionnement du programme. C'est plus avantageux pour les environnements en temps réel où le programme ne doit pas être interrompu pendant une longue période.
Inconvénients : Impossible de détecter les références circulaires. Si l'objet parent a une référence à l'objet enfant, l'objet enfant fait à son tour référence à l'objet parent. De cette façon, leur nombre de références ne peut jamais être nul.

Quel est le mécanisme de récupération de place de JVM ?

Analyse du code ci-dessus via la méthode de comptage de références :

Quel est le mécanisme de récupération de place de JVM ?

Quel est le mécanisme de récupération de place de JVM ?

3-Quel est le mécanisme de récupération de place de JVM ?

2. .Algorithme, le programme traite toutes les relations de référence comme un graphique, à partir d'un nœud GC Roots, à la recherche du nœud de référence correspondant. Après avoir trouvé ce nœud, continuez à rechercher le nœud de référence de ce nœud. Lorsque tous les nœuds de référence sont recherchés, les nœuds restants. sont considérés comme des nœuds qui n'ont pas été référencés, c'est-à-dire que les nœuds inutiles seront considérés comme des objets recyclables.

Dans le langage Java, les objets pouvant être utilisés comme racines GC sont les suivants :

● Objets référencés dans la pile de la machine virtuelle (table de variables locales dans le cadre de la pile)

● Objets référencés par les attributs statiques de classe dans la méthode ; zone ;
● Objets référencés par des constantes dans la zone de méthode ;
● Objets référencés par JNI (méthodes natives) dans la pile de méthodes locale.



Quel est le mécanisme de récupération de place de JVM ?On peut conclure que les instances d'objet 1, 2, 4 et 6 ont toutes une accessibilité d'objet, c'est-à-dire des objets survivants et des objets qui ne peuvent pas être recyclés par GC. Bien que les instances Caprice 3 et 5 soient directement connectées, aucune racine GC ne leur est connectée, c'est-à-dire que les objets inaccessibles par les racines GC seront recyclés par GC.

3. Algorithme de collecte des déchets

1. Algorithme de marquage L'idée de base de l'algorithme de marquage/effacement est tout comme son nom, qui est divisé en deux étapes : "marquer" et " clear": premier marquage Supprimez tous les objets qui doivent être recyclés et recyclez uniformément tous les objets marqués une fois le marquage terminé.


Étape de marquage : Le processus de marquage est en fait le processus de l'algorithme d'analyse d'accessibilité introduit précédemment. Il parcourt tous les objets GC Roots et met une marque sur les objets accessibles depuis l'objet GCRoots. objet, enregistrez-le comme un objet accessible.

Phase de nettoyage : Le processus de nettoyage consiste à parcourir la mémoire du tas. S'il s'avère qu'un objet n'est pas marqué comme objet accessible (en lisant les informations d'en-tête de l'objet), il sera recyclé.

Quel est le mécanisme de récupération de place de JVM ?L'image ci-dessus est un diagramme schématique de l'algorithme de marquage/effacement. Dans la phase de marquage, l'objet B est accessible à partir de l'objet GC Root 1 et l'objet E est accessible à partir de l'objet B. Par conséquent, à partir de la racine GC. 1 à B et E, les deux sont accessibles De même, les objets F, G, J et K sont tous des objets accessibles en phase de nettoyage, tous les objets inaccessibles seront recyclés.

Lorsque le garbage collector effectue GC, tous les threads d'exécution Java doivent être arrêtés (également appelé "Stop The World") La raison en est que lorsque l'analyse d'accessibilité est effectuée pendant la phase de marquage, la relation de référence d'objet ne peut pas continuer à changer pendant la phase de marquage. processus d’analyse, sinon l’exactitude des résultats de l’analyse d’accessibilité ne peut pas être garantie. Le thread d’application ne reprendra pas son exécution tant que la marque ne sera pas effacée.


Inconvénients de l'algorithme de marquage/effacement : Problèmes d'efficacité
Les deux étapes de marquage et d'effacement ne sont pas très efficaces, car les deux étapes doivent parcourir les objets dans la mémoire, et plusieurs fois les objets dans la mémoire. mémoire Le nombre d'instances est très important, ce qui prend sans aucun doute du temps, et l'application doit être arrêtée pendant le GC, ce qui entraînera une très mauvaise expérience utilisateur.
Problème d'espace
Une fois la marque effacée, un grand nombre de fragments de mémoire discontinus seront générés (comme le montre l'image ci-dessus). Un trop grand nombre de fragments d'espace mémoire peut entraîner l'incapacité de trouver des objets plus gros qui en ont besoin. à allouer pendant l'exécution du programme. Suffisamment de mémoire contiguë pour déclencher une autre action de garbage collection à l'avance.

2. Algorithme de copie L'algorithme de copie divise la mémoire disponible en deux blocs de taille égale en fonction de la capacité et utilise un bloc à la fois. Lorsque ce bloc de mémoire est épuisé, copiez les objets survivants dans un autre bloc de mémoire, puis nettoyez tous les objets de ce bloc de mémoire en même temps


L'algorithme de copie recycle la mémoire de la moitié entière de la zone à chaque fois, ce qui réduit le temps de parcours des objets marqués. Lors de l'effacement des objets de zone utilisés, il n'est pas nécessaire de parcourir, toute la mémoire de la zone est directement effacée et les objets survivants. les objets sont copiés dans la zone réservée. Les régions sont également stockées dans l'ordre des adresses, ce qui résout le problème de la fragmentation de la mémoire. Lors de l'allocation de la mémoire des objets, il n'est pas nécessaire de prendre en compte des problèmes complexes tels que la fragmentation de la mémoire. .

Inconvénients de l'algorithme de copie :
L'algorithme de copie est simple et efficace, optimisant les problèmes de faible efficacité et de fragmentation de la mémoire de l'algorithme de marque et d'effacement. Il y a des inconvénients :
● Réduire la mémoire à la moitié de l'original. taille, gaspillant la moitié de l'espace mémoire, Le coût est trop élevé ;
● Si le taux de survie de l'objet est très élevé, dans un cas extrême, en supposant que le taux de survie de l'objet est de 100 %, alors nous devons copier tous les objets survivants. , et le coût en temps ne peut être ignoré.

3. Algorithme Mark-Collate

Algorithme Mark-Collate L'algorithme est très similaire à l'algorithme mark/clear. En fait, le processus de marquage de l'algorithme mark/assemblate est toujours le même que celui de l'algorithme mark/clear. , mais les étapes suivantes ne sont pas directement liées aux objets recyclables. Les objets recyclables sont recyclés, mais tous les objets survivants sont déplacés vers une extrémité, puis la mémoire au-delà du bord d'extrémité est directement effacée.
Quel est le mécanisme de récupération de place de JVM ?

Vous pouvez voir que les objets recyclables sont nettoyés après recyclage et que les objets survivants sont classés en mémoire selon des règles. De cette façon, lorsque nous allouons de la mémoire à un nouvel objet, le jvm n'a besoin que de conserver l'adresse de départ de la mémoire. L'algorithme de marquage/organisation compense le problème de fragmentation de la mémoire de l'algorithme de marquage/effacement et élimine le coût élevé de la réduction de moitié de la mémoire de l'algorithme de copie. On peut dire qu'il fait d'une pierre deux coups.

Inconvénients du marquage/organisation :
● Inefficacité : non seulement les objets survivants doivent être marqués, mais aussi les adresses de référence de tous les objets survivants doivent être organisées, ce qui n'est pas aussi efficace que l'algorithme de copie.

4. Algorithme de collecte générationnelle

L'idée de l'algorithme de collecte générationnelle est de diviser la mémoire en plusieurs blocs en fonction des différents cycles de survie des objets. Généralement, le tas Java est divisé en nouvelle génération et. l'ancienne génération (il existe également une génération permanente, c'est une implémentation unique de HotSpot. Les autres implémentations de machines virtuelles n'ont pas ce concept. L'effet de collecte de la génération permanente est très faible. Généralement, le garbage collection de la génération permanente est rarement effectué), afin de pouvoir utiliser l’algorithme de collecte le plus approprié en fonction des caractéristiques de chaque époque.

Caractéristiques :
La nouvelle génération : elle naît et disparaît rapidement, et sa durée de survie est très courte. Utilisez l'algorithme de réplication pour collecter
Ancienne génération : survivez après plusieurs GC mineurs et ayez une longue période de survie. Utilisez l'algorithme mark/clear ou l'algorithme mark/organize pour collecter l'ancienne génération

Chaque garbage collection de la nouvelle génération constate qu'un grand nombre d'objets meurent et que seuls quelques-uns survivent. Par conséquent, un algorithme de copie est utilisé pour recycler les objets. nouvelle génération, qui ne nécessite que le coût de copie d'un petit nombre d'objets. La collection peut être complétée
Le taux de survie des objets de l'ancienne génération est élevé et n'est pas adapté à l'utilisation de l'algorithme de copie ; La génération utilise l'algorithme de copie, elle n'aura pas d'espace supplémentaire pour la garantie d'allocation, donc l'algorithme de marquage/nettoyage ou l'algorithme de marquage/collage pour le recyclage.

Quel est le mécanisme de récupération de place de JVM ?

Les objets de la nouvelle génération "vivent et meurent". Chaque fois que GC se produit, un grand nombre d'objets mourront et un petit nombre survivra. L'algorithme de réplication est utilisé. La nouvelle génération est divisée en zone Eden et zone Survivant (Survivant de, Survivant vers), et le rapport de taille par défaut est de 8:1:1.
Les objets de l'ancienne génération utilisent l'algorithme de marquage ou de complément de marquage car le taux de survie des objets est élevé et il n'y a pas d'espace supplémentaire pour la garantie d'allocation.
Les objets nouvellement générés entrent en premier dans la zone Eden. Lorsque la zone Eden est pleine, Survivor from est utilisé. Lorsque Survivor from est également plein, un GC mineur (nouvelle génération GC) est effectué et les objets survivants dans Eden et Survivor from sont copiés. dans Survivant, puis éliminez Eden et Survivant. À ce moment-là, le Survivant d'origine devient le nouveau Survivant de, et le Survivant d'origine devient le nouveau Survivant de. Lors de la copie, si le survivant ne peut pas accueillir tous les objets survivants, les objets seront copiés dans l'ancienne génération sur la base de la garantie d'attribution de l'ancienne génération (similaire à la garantie de prêt d'une banque si l'ancienne génération ne peut pas l'héberger, un GC complet). (ancienne génération) sera réalisée.
Les objets volumineux entrent directement dans l'ancienne génération : Il existe une configuration de paramètre dans la JVM
-XX:PretenureSizeThreshold, qui fait que les objets plus grands que cette valeur de paramètre entrent directement dans l'ancienne génération. Le but est d'éviter un grand nombre de copies de mémoire entre. les zones Eden et Survivor.
Les objets survivants à long terme entrent dans l'ancienne génération : JVM définit un compteur d'âge d'objet pour chaque objet si l'objet survit encore après la naissance d'Eden et passe le premier GC mineur, et peut être hébergé par le survivant, il sera déplacé vers. le survivant et son âge est fixé à 1. S'il n'a pas survécu à un GC mineur, son âge sera augmenté de 1. Lorsque son âge atteint un certain niveau (la valeur par défaut est de 15 ans, qui peut être définie via XX:MaxTenuringThreshold), il sera déplacé vers l'ancienne génération. . Cependant, la JVM n'exige pas toujours que l'âge atteigne l'âge maximum avant d'être promu à l'ancienne génération si la somme des tailles de tous les objets du même âge (par exemple, l'âge est x) dans l'espace Survivant est égale. supérieur à la moitié du Survivant, tous les objets ayant un âge supérieur ou égal à x entreront directement dans l'ancienne génération, pas besoin d'attendre l'âge maximum requis.

Recyclage générationnel :

Nous utilisons un objet1 pour illustrer sa trajectoire de recyclage dans l'algorithme de collecte des déchets générationnel.

1. Object1 est nouvellement créé et est né dans la zone Eden de la nouvelle génération.
Quel est le mécanisme de récupération de place de JVM ?
2. GC mineur, l'objet1 est toujours vivant et déplacé vers l'espace From survivant Il est toujours dans la nouvelle génération en ce moment.

Quel est le mécanisme de récupération de place de JVM ?

3. GC mineur, l'objet1 est toujours en vie. À ce moment, l'objet1 sera déplacé vers la zone ToSuv via l'algorithme de copie. À ce moment, l'âge de l'objet1 est de +1.
Quel est le mécanisme de récupération de place de JVM ?
4. GC mineur, l'objet1 est toujours en vie A ce moment, les objets du même âge que l'objet1 chez le survivant n'ont pas atteint la moitié des survivants, donc à ce moment, les zones fromSuv et Tosuv sont échangées. via l'algorithme de copie, et les objets survivants sont déplacés vers Tosuv.
Quel est le mécanisme de récupération de place de JVM ?
5. GC mineur, l'objet1 est toujours vivant, à ce moment, les objets du même âge que l'objet1 chez le survivant ont atteint plus de la moitié des survivants (la zone toSuv est pleine), et l'objet1 est déplacé. à la zone de l’ancienne génération.
Quel est le mécanisme de récupération de place de JVM ?
6. Après que l'objet1 ait survécu pendant un certain temps, il s'avère que l'objet1 ne peut pas atteindre GcRoots à ce moment-là, et le rapport d'espace de l'ancienne génération a dépassé le seuil à ce moment-là, déclenchant majorGC (cela peut également être considéré comme fullGC, mais cela nécessite un garbage collector) Contact), object1 est recyclé à ce moment. fullGC déclenchera l’arrêt du monde.
Quel est le mécanisme de récupération de place de JVM ?
Dans la nouvelle génération ci-dessus, nous avons mentionné l'âge de l'objet. L'objet survit à l'état de survivant et ne sera pas immédiatement promu à l'objet d'ancienne génération pour éviter un impact excessif sur l'ancienne génération. les conditions suivantes peuvent être favorisées :
1. Après un gc mineur, l'âge des objets survivant dans la zone survivant sera de +1 Lorsqu'il dépassera (par défaut) 15, il sera transféré à l'ancienne génération.
2. Objets dynamiques, si la taille combinée de tous les objets du même âge dans l'espace survivant est supérieure à la moitié de l'espace survivant, les objets avec une note supérieure ou égale à cet âge peuvent entrer directement dans l'ancienne génération.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn