Compréhension approfondie de l'algorithme de collecte des ordures de la machine virtuelle Java (deuxième édition)

table des matières

 

3.3.1 Algorithme Mark-Clear

3.3.2 Algorithme de copie

3.3.3 Algorithme de marquage-tri

3.3.4 Algorithme de collecte générationnel


3.3.1 Algorithme Mark-Clear

L'algorithme de collecte le plus basique est l'algorithme "Mark-Sweep". Comme son nom, l'algorithme est divisé en deux étapes: "Marquage" et "Balayage": tout d'abord, tous les objets à recycler sont marqués. Après l'achèvement, tous les objets marqués sont récupérés uniformément.Le processus de marquage a en fait été introduit dans la section précédente sur la détermination du marquage des objets. La raison pour laquelle on dit qu'il s'agit de l'algorithme de collecte le plus basique est que les algorithmes de collecte ultérieurs sont basés sur cette idée et améliorés sur ses lacunes.
Il présente deux défauts principaux : l'un est le problème d'efficacité , l' efficacité des processus de marquage et de compensation n'est pas élevée; l'autre est le problème d'espace , une fois le marquage effacé, un grand nombre de fragments de mémoire discontinus sera généré et une fragmentation excessive de l'espace peut entraîner Plus tard, lorsqu'un objet plus volumineux doit être alloué pendant l'exécution du programme, il ne peut pas trouver suffisamment de mémoire contiguë et doit déclencher un autre garbage collection à l'avance. Le processus d'exécution de l'algorithme de suppression de marquage est illustré à la Figure 3-2.

 

3.3.2 Algorithme de copie

Afin de résoudre le problème d'efficacité, un algorithme de collecte appelé "Copying" est apparu, qui divise la mémoire disponible en deux morceaux de taille égale en fonction de la capacité, et n'utilise qu'un seul morceau à la fois. Lorsque ce bloc de mémoire est épuisé, les objets survivants sont copiés dans un autre bloc, puis l'espace mémoire utilisé est immédiatement nettoyé. De cette manière, toute la moitié de la zone est récupérée à chaque fois et il n'est pas nécessaire de prendre en compte la fragmentation de la mémoire et d'autres situations complexes lorsque la mémoire est allouée. Il suffit de déplacer le pointeur en haut du tas et d'allouer la mémoire dans l'ordre, ce qui est simple à implémenter et efficace à exécuter. C'est juste que le coût de cet algorithme est de réduire la mémoire à la
moitié de l'original, ce qui est trop élevé. Le processus d'exécution de l'algorithme de réplication est illustré à la Figure 3-3.

  • Les machines virtuelles commerciales actuelles utilisent toutes cet algorithme de collecte pour recycler la nouvelle génération. La recherche spéciale d'IBM montre que 98% des objets de la nouvelle génération sont «vivants et meurent», il n'est donc pas nécessaire de les diviser dans un rapport 1: 1. L'espace mémoire, mais la mémoire est divisée en un espace Eden plus grand et deux espaces Survivor plus petits, chaque fois que vous utilisez Eden et l'un des Survivor. Lors du recyclage, copiez les objets survivants dans Eden et Survivor dans un autre espace Survivor à la fois, et nettoyez enfin Eden et l'espace Survivor qui vient d'être utilisé. Le rapport par défaut entre Eden et Survivor pour la machine virtuelle HotSpot est de 8: 1, ce qui signifie que l'espace mémoire disponible à chaque nouvelle génération est de 90% (80% + 10%) de la capacité totale de la nouvelle génération et que seulement 10% de la mémoire sera «gaspillée» ". Bien sûr, 98% des objets qui peuvent être récupérés ne sont que des données dans des scénarios généraux. Nous n'avons aucun moyen de garantir que pas plus de 10% des objets survivent à chaque fois. Lorsque l'espace Survivor n'est pas suffisant, vous devez vous fier à une autre mémoire (ici se réfère à l'ancienne génération). Garantie de distribution (Handle Promotion).
  • La garantie d'allocation de mémoire, c'est comme aller à la banque pour emprunter de l'argent. Si nous avons une bonne réputation, nous pouvons rembourser à temps dans 98% des cas, de sorte que la banque peut supposer que nous pourrons rembourser le prêt à temps et en montant la prochaine fois, une seule garantie est nécessaire. Les gens peuvent garantir que si je peux déduire de l'argent de son compte alors que je ne peux pas rembourser, alors la banque pense qu'il n'y a aucun risque. La garantie d'allocation de mémoire est également la même: si une autre partie de l'espace Survivor ne dispose pas de suffisamment d'espace pour placer les objets survivants collectés dans la nouvelle génération, ces objets entreront directement dans l'ancienne génération via le mécanisme de garantie d'allocation. Le contenu de la garantie d'allocation pour la nouvelle génération sera expliqué en détail plus loin dans ce chapitre lorsque les règles d'exécution du ramasse-miettes seront expliquées.

3.3.3 Algorithme de marquage-tri

L'algorithme de collecte de copies effectuera plus d'opérations de copie lorsque le taux de survie de l'objet est élevé et l'efficacité sera inférieure. Plus important encore, si vous ne voulez pas gaspiller 50% de l'espace, vous devez disposer d'un espace supplémentaire pour les garanties d'allocation afin de faire face à la situation extrême où tous les objets de la mémoire utilisée sont 100% vivants, donc ce n'est généralement pas directement utilisé dans la vieillesse. algorithme.
Selon les caractéristiques de la vieillesse, quelqu'un a proposé un autre algorithme "Mark-Compact". Le processus de marquage est toujours le même que l'algorithme "Mark-Clear", mais les étapes suivantes ne sont pas directement le nettoyage des objets recyclables. Au lieu de cela, tous les objets survivants sont déplacés vers une extrémité, puis la mémoire à l'extérieur de la limite d'extrémité est directement nettoyée. Le diagramme schématique de l'algorithme de «marquage-tri» est illustré à la figure 3-4.

3.3.4 Algorithme de collecte générationnel

Le ramasse-miettes actuel des machines virtuelles commerciales utilise l'algorithme "Generational Collection". Cet algorithme n'a pas d'idées nouvelles, mais divise la mémoire en plusieurs blocs en fonction du cycle de vie de l'objet. Généralement, le tas Java est divisé en nouvelle génération et ancienne génération, de sorte que l'algorithme de collecte le plus approprié puisse être adopté en fonction des caractéristiques de chaque génération. Dans la nouvelle génération, un grand nombre d'objets meurent à chaque fois qu'un garbage collection, et seuls quelques-uns survivent, puis l'algorithme de réplication est sélectionné et la collecte ne peut être terminée qu'en payant le coût de réplication d'un petit nombre d'objets survivants. Dans la vieillesse, parce que l'objet a un taux de survie élevé et pas d'espace supplémentaire pour sa garantie d'allocation, il est nécessaire d'utiliser l'algorithme "mark-clean up" ou "mark-clean up" pour le recyclage.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/someby/article/details/103880289
conseillé
Classement