Nous savons tous que la plus grande différence entre le langage Java et le langage C est le recyclage automatique de la mémoire. Alors, comment la JVM contrôle-t-elle le recyclage de la mémoire ? Cet article présentera plusieurs algorithmes de garbage collection JVM pour comprendre les bases du recyclage de la mémoire. principe.
arrêter le monde
Avant d'introduire l'algorithme de collecte des ordures, nous devons d'abord comprendre le mot "arrêter le monde", arrêter le monde se produit lors de l'exécution d'un certain algorithme de garbage collection. Afin d'effectuer le garbage collection, la JVM exécutera temporairement l'application Java et attendra que le garbage collection soit terminé avant de continuer à s'exécuter. Si vous avez utilisé JMeter pour tester un programme Java, vous constaterez peut-être que pendant le test, le programme Java a des pauses irrégulières. En fait, il s'agit de "arrêter le monde". Pendant la pause, la JVM effectue un garbage collection. Donc, réduire autant que possible le temps nécessaire pour arrêter le monde est notre objectif principal dans l'optimisation de la JVM. Examinons ensuite les algorithmes courants de garbage collection actuellement disponibles.
Méthode de comptage de références
La méthode de comptage de références, comme son nom l'indique, compte le nombre de fois qu'un objet est référencé lors d'un décompte de références. est augmenté, la méthode de comptage de référence est augmentée de 1. Diminuer le compte de référence de un le réduit de 1.
La figure ci-dessus montre que trois références Teacher pointent vers l'objet Teacher dans le tas, puis le nombre de références du L'objet Enseignant est 3 , et ainsi de suite, le nombre de références de l'objet Étudiant est 2.
La figure ci-dessus montre que la référence de l'objet Enseignant est réduit à 2, La référence de l'objet Student est réduite à 0 (la raison de la réduction est que la référence pointe vers null, comme Teacher3=null Selon l'algorithme de comptage de références, l'espace mémoire de l'objet Student). sera récupéré.
Le principe de l'algorithme de comptage de références est très simple et est l'algorithme de recyclage le plus primitif. Cependant, cet algorithme n'est pas utilisé en Java pour 2 raisons. et 2. Incapable de gérer les problèmes de référence circulaire.
Par exemple, l'objet Teacher fait référence à l'objet Student, et l'objet Student fait référence à l'objet Teacher. Dans ce cas, l'objet ne sera jamais recyclé.
Marquer et effacer
Algorithme de marquage et d'effacement, qui est la base de nombreux algorithmes de collecte des ordures. En termes simples, il y a deux étapes : marquer et effacer.
Mark: Traverser toutes les GC Roots et définir les objets accessibles depuis GC Roots comme objets vivants
Clear: Traverser le tas Tous les objets dans , les objets qui ne sont pas marqués comme accessibles seront effacés
Faites attention aux objets gris dans l'algorithme de récupération de place jvm ci-dessus, car ils ne peuvent pas être traversés depuis la racine GC (bien qu'ils aient eux-mêmes des relations de référence, ils ne peuvent pas être traversés depuis la racine GC), ils ne sont donc pas marqués comme objets vivants et seront recyclés pendant le processus de nettoyage.
Ce qui doit être noté ici, c'est que lors de l'exécution de l'algorithme d'effacement des marques, "arrêter le monde" se produira, permettant au programme Java de faire une pause et d'attendre pour s'assurer qu'il y aura Aucune nouvelle entrée n'est générée pendant le processus d'effacement des marques. Pourquoi le programme Java doit-il être mis en pause ? Par exemple, si un nouvel objet est généré une fois le processus de marquage terminé et que l'objet a manqué la période de marquage, alors lors du processus de nettoyage ultérieur, l'objet nouvellement généré sera considéré comme non marqué car il n'a pas été marqué. Si un objet inaccessible est effacé, le programme générera une erreur. Par conséquent, lorsque l'algorithme d'effacement des marques sera exécuté, le programme Java sera suspendu, ce qui entraînera « l'arrêt du monde ».
Ensuite, nous résumons l'algorithme de marquage et d'effacement :
1 Parce qu'il implique beaucoup de travail de traversée de la mémoire, les performances d'exécution sont faibles. . Cela entraînera également un temps d'arrêt du monde plus long et une réduction du débit du programme Java
2. Nous avons remarqué qu'une fois l'objet effacé, l'objet effacé laisse un espace vacant ; d'espace dans la mémoire, provoquant une discontinuité de la mémoire et un gaspillage d'espace.
Voyons ensuite si d'autres algorithmes peuvent améliorer ces problèmes ?
Compression des balises
Vous avez peut-être pensé à l'algorithme de compression des marques. Il est basé sur l'algorithme de suppression des marques et ajoute un processus de compression.
Une fois l'effacement des marques terminé, l'espace mémoire est compressé pour économiser de l'espace mémoire et résoudre le problème de l'effacement des marques. Mémoire d’algorithme. Problème de discontinuité.
Notez que l'algorithme de compression des marques produira également "arrêter le monde" et ne pourra pas être exécuté simultanément avec le programme Java. Pendant le processus de compression, les adresses mémoire de certains objets changeront et le programme Java ne pourra qu'attendre la fin de la compression avant de continuer.
Algorithme de copie
L'algorithme de copie divise simplement la mémoire en deux parties, mais n'en utilise qu'une lors du garbage collection, copiez la. les objets survivants dans la mémoire utilisée vers une autre mémoire vierge, et enfin effacer les objets dans l'espace mémoire utilisé pour terminer le garbage collection.
Copier la balise relative de l'algorithme L'algorithme de compression est plus concis et efficace, mais ses défauts sont également évidents. Il ne convient pas aux situations où il existe de nombreux objets survivants, car de nombreux objets doivent être copiés et les performances de copie sont donc médiocres. L'algorithme de copie est souvent utilisé dans la nouvelle génération dans l'espace mémoire, car il y a moins d'objets survivants dans la nouvelle génération et le coût de copie est inférieur. Un autre inconvénient est son coût élevé d'occupation de l'espace mémoire, car il copie les objets sur la base de deux espaces mémoire et n'utilise qu'un seul espace mémoire pendant le cycle de non-garbage collection, ce qui entraîne une faible utilisation de la mémoire.
Résumé
Ci-dessus, nous avons présenté les algorithmes courants de collecte des ordures. Chacun de ces algorithmes a ses propres avantages et inconvénients, mais ce ne sont pas les mêmes. C'est la même chose dans la JVM. Au lieu d'utiliser simplement un algorithme spécifique, vous utilisez quelque chose appelé un garbage collector. Le garbage collector peut être considéré comme une combinaison différente d'une série d'algorithmes. Ce n'est qu'en utilisant le garbage collector approprié dans différents scénarios que vous pouvez obtenir. deux fois le résultat avec la moitié de l'effort. Notre prochain article présentera le garbage collector.
Matériel de référence :
"Machine virtuelle Java pratique" Ge Yiming
"Compréhension approfondie de Machine virtuelle Java "Machine (2e édition)》Zhou Zhiming
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!