Maison  >  Article  >  Java  >  Gestion de la mémoire JVM------Explication exquise de l'algorithme GC (algorithme de copie et algorithme de marquage/collage)

Gestion de la mémoire JVM------Explication exquise de l'algorithme GC (algorithme de copie et algorithme de marquage/collage)

黄舟
黄舟original
2016-12-28 15:47:221297parcourir

Algorithme de copie

Jetons d'abord un coup d'œil à la pratique de l'algorithme de copie. L'algorithme de copie divise la mémoire en deux intervalles, à tout moment, tous les objets alloués dynamiquement ne peuvent être alloués qu'en un seul. des intervalles (appelé intervalle actif), tandis que l’autre intervalle (appelé intervalle inactif) est inactif.
Lorsque l'espace mémoire effectif est épuisé, la JVM mettra le programme en pause et démarrera le thread GC de l'algorithme de copie. Ensuite, le thread GC copiera tous les objets survivants de l'intervalle actif vers l'intervalle libre et les organisera strictement en fonction de l'adresse mémoire. En même temps, le thread GC mettra à jour l'adresse de référence mémoire de l'objet survivant vers lequel pointer. à la nouvelle adresse mémoire.
À ce stade, l'intervalle libre a été échangé avec l'intervalle actif, et tous les objets indésirables sont désormais restés dans l'intervalle actif d'origine, qui est l'intervalle libre actuel. En fait, lorsque l’intervalle actif est converti en intervalle spatial, les objets indésirables ont été recyclés d’un seul coup.
Ça vous paraît compliqué ?
En fait, ce n'est pas compliqué du tout. Avec la base du chapitre précédent, je pense qu'il ne vous faudra pas beaucoup d'efforts pour comprendre cet algorithme. LZ dessine une image pour illustrer le problème, comme indiqué ci-dessous.

Gestion de la mémoire JVM------Explication exquise de lalgorithme GC (algorithme de copie et algorithme de marquage/collage)

En fait, cette image est toujours l'exemple du chapitre précédent, mais maintenant la mémoire est divisée en deux parties par l'algorithme de copie. Jetons un coup d'œil au GC. le traitement des threads de l'algorithme de copie. Ce à quoi ressembleront les deux zones après cela est indiqué ci-dessous.

Gestion de la mémoire JVM------Explication exquise de lalgorithme GC (algorithme de copie et algorithme de marquage/collage)

Vous pouvez voir que les objets 1 et 4 ont été effacés, tandis que les objets 2, 3, 5 et 6 sont régulièrement disposés dans l'intervalle libre à l'instant. la plage d’activité actuelle. A ce moment, la moitié gauche est devenue un intervalle inactif. Il n'est pas difficile d'imaginer qu'après le prochain GC, la moitié gauche redeviendra un intervalle actif.
De toute évidence, l'algorithme de copie compense les défauts de la disposition chaotique de la mémoire dans l'algorithme de marquage/effacement. Mais en même temps, ses défauts sont également évidents.
1. Cela gaspille la moitié de la mémoire, ce qui est terrible.
2. Si le taux de survie de l'objet est très élevé, nous pouvons aller un peu à l'extrême en supposant une survie de 100 %, alors nous devons copier tous les objets et réinitialiser toutes les adresses de référence. Le temps passé à copier cette œuvre deviendra non négligeable lorsque le taux de survie des objets atteindra un certain niveau.
Il n'est donc pas difficile de voir à partir de la description ci-dessus que pour utiliser l'algorithme de réplication, au moins le taux de survie de l'objet doit être très faible, et le plus important est que nous devons surmonter le gaspillage de 50 % de mémoire.

Algorithme Mark/Collate

L'algorithme Mark/Collate est très similaire à l'algorithme Mark/Clear. Il est également divisé en deux étapes : le marquage et le tri. Ensuite, LZ vous présentera ce qui a été fait au cours de ces deux étapes.
Marquage : Sa première phase est exactement la même que l'algorithme mark/clear, qui parcourt les racines GC puis marque les objets survivants.
Organisation : déplacez tous les objets survivants et organisez-les par ordre d'adresses mémoire, puis recyclez toute la mémoire après l'adresse mémoire de fin. C’est pourquoi la deuxième étape est appelée étape de finition.
Le diagramme avant et après GC est très similaire au diagramme de l'algorithme de copie, sauf qu'il n'y a pas de différence entre l'intervalle actif et l'intervalle libre, et le processus est très similaire à l'algorithme de marquage/effacement. à l’état des objets dans la mémoire avant GC avec la disposition indiquée ci-dessous.

Gestion de la mémoire JVM------Explication exquise de lalgorithme GC (algorithme de copie et algorithme de marquage/collage)

Cette image est en fait exactement la même que l'algorithme mark/clear, sauf que afin de faciliter l'agencement continu des règles de mémoire, LZ a ajouté un rectangle pour représenter la mémoire zone. Si le thread GC commence à fonctionner à ce moment-là, la phase de marquage commence immédiatement. Cette étape est la même que l'étape de marquage de l'algorithme mark/clear. Nous examinons l'état de l'objet après l'étape de marquage, comme indiqué ci-dessous.

Gestion de la mémoire JVM------Explication exquise de lalgorithme GC (algorithme de copie et algorithme de marquage/collage)

Il n'y a rien à expliquer Ensuite, ce devrait être l'étape d'organisation. Jetons un coup d'œil à ce à quoi ressemble la disposition de la mémoire une fois la phase de tri terminée, comme indiqué ci-dessous.

Gestion de la mémoire JVM------Explication exquise de lalgorithme GC (algorithme de copie et algorithme de marquage/collage)

Comme vous pouvez le voir, les objets survivants marqués seront organisés et disposés dans l'ordre en fonction de l'adresse mémoire, tandis que la mémoire non marquée sera nettoyée. De cette façon, lorsque nous devons allouer de la mémoire pour un nouvel objet, la JVM n'a besoin que de conserver l'adresse de départ de la mémoire, ce qui représente évidemment beaucoup moins de surcharge que de maintenir une liste libre.
Il n'est pas difficile de voir que l'algorithme de marquage/organisation peut non seulement compenser les défauts de la zone de mémoire dispersée dans l'algorithme de marquage/effacement, mais également éliminer le coût élevé de réduction de moitié de la mémoire dans l'algorithme de copie. On peut dire qu'il fait d'une pierre deux coups, qu'il fait d'une pierre deux coups et qu'il fait d'une pierre deux coups. . . . Une femme et deux hommes ?
Cependant, tout algorithme aura ses inconvénients. Le seul inconvénient de l'algorithme de marquage/organisation est qu'il n'est pas très efficace. Il doit non seulement marquer tous les objets survivants, mais également trier les adresses de référence de tous les objets survivants. . En termes d'efficacité, l'algorithme de marquage/classement est inférieur à l'algorithme de copie.

Résumé de l'algorithme

Ici, LZ résumera les points communs des trois algorithmes et leurs avantages et inconvénients respectifs, afin que vous puissiez les comparer et que ce soit plus clair.
Les principales choses qu'ils ont en commun sont les deux points suivants.
1. Les trois algorithmes sont tous basés sur l'algorithme de recherche racine pour déterminer si un objet doit être recyclé. La base théorique qui prend en charge le fonctionnement normal de l'algorithme de recherche racine est le contenu pertinent de la portée variable dans la grammaire. Par conséquent, le moyen le plus fondamental d'éviter les fuites de mémoire est de maîtriser la portée des variables, au lieu d'utiliser la méthode de gestion de la mémoire de type C/C mentionnée dans le chapitre précédent sur la gestion de la mémoire.
2. Lorsque le thread GC est démarré, ou lorsque le processus GC démarre, ils doivent mettre l'application en pause (arrêter le monde).
LZ vous montrera leurs différences selon les points suivants. (> Indique que le premier est meilleur que le second, = signifie que les deux ont le même effet)
Efficacité : Copier l'algorithme > Marquer/organiser l'algorithme > de complexité temporelle, ce n'est pas nécessairement le cas).
Nettoyage de la mémoire : algorithme de copie = algorithme de marquage/organisation>
Utilisation de la mémoire : [b] Algorithme de marquage/assemblage = Algorithme de marquage/balayage > Algorithme de copie. [/b]
Vous pouvez voir que l'algorithme mark/clear est un algorithme relativement arriéré, mais les deux derniers algorithmes sont construits sur cette base, comme le dit le proverbe : « N'oubliez pas le puisatier lorsque vous y êtes. problème", vous ne devez donc pas oublier les prédécesseurs de l'algorithme de marquage/balayage. De plus, à un moment donné, le marquage/balayage entre en jeu.

Conclusion

Nous avons maintenant une compréhension claire des trois algorithmes. On voit qu'en termes d'efficacité, l'algorithme de réplication est le leader, mais il gaspille trop de mémoire. prendre en compte les trois indicateurs mentionnés ci-dessus. L'algorithme de marquage/organisation est relativement plus fluide, mais l'efficacité est encore insatisfaisante. Il comporte une étape de marquage de plus que l'algorithme de copie et une étape de plus que l'algorithme de marquage/effacement. mémoire.
N’existe-t-il pas un algorithme optimal ?
Bien sûr que non. Le monde est juste et tout a deux côtés. Imaginez, comment pourriez-vous trouver quelqu'un qui soit beau, travailleur, riche, raisonnable, qui ait la bonne personnalité, les bonnes origines familiales, la bonne taille, la bonne apparence. , etc. Attendez, une femme convenable ? Même si vous en trouvez un, il y a au moins une chose dont cette femme ne sera certainement pas satisfaite, c'est-à-dire qu'elle ne tombera probablement pas amoureuse d'un des amis singes qui travaillent dur et qui ressemblent à LZ. Voulez-vous dire que vous êtes bien meilleur que LZ ? Alors LZ veut juste vous dire que Gao Fushuai ne rampera pas devant l'ordinateur pour lire des articles techniques, 0.0.
Mais les anciens sont géniaux. Les anciens disaient que lorsqu'on cherche une femme, il n'est pas nécessaire de trouver la meilleure, mais la plus appropriée. Après avoir écouté cette phrase, j'ai immédiatement senti que le monde était beaucoup. mieux.
L'algorithme est le même. Il n'y a pas de meilleur algorithme, seulement l'algorithme le plus approprié.
Étant donné que ces trois algorithmes ont leurs propres défauts, les experts ne permettront naturellement pas que cela se produise. Par conséquent, les experts ont proposé que différents algorithmes puissent être utilisés en fonction de différentes caractéristiques de l’objet, similaire au principe selon lequel chaque carotte et chaque chou ont leurs propres préférences. Un miracle s'est donc produit et les experts ont finalement trouvé l'algorithme de niveau divin parmi les algorithmes GC ----- l'algorithme de collecte générationnelle.
Quant à la façon dont cet algorithme de niveau divin est traité, LZ en discutera avec tous ses amis singes dans le prochain chapitre. C'est tout pour cette fois, j'espère que vous pourrez gagner quelque chose.

Ce qui précède est le contenu de la gestion de la mémoire JVM ------ Algorithme GC (algorithme de copie et algorithme de marquage/collation). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php). .cn) !


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