Maison  >  Article  >  interface Web  >  Une brève analyse du mécanisme de tas et de garbage collection

Une brève analyse du mécanisme de tas et de garbage collection

hzc
hzcavant
2020-07-03 09:20:081805parcourir

Dans cet article, nous nous concentrons principalement sur ces questions : Une fois le programme Java exécuté, quand les objets du tas seront-ils recyclés ? Comment recycler ?

Le tas est également appelé « tas GC ». Puisque les collectionneurs utilisent désormais essentiellement des algorithmes de collecte générationnelle, le tas Java peut également être subdivisé en : nouvelle génération et ancienne génération, Le rapport est de 1 : 2 ; pour être plus détaillé, la nouvelle génération est divisée en zone Eden et zone Survivant, et le rapport est de 8 : 1. La figure suivante montre la structure du tas :

L'allocation de mémoire pour les objets dans le tas est strictement réglementée, la stratégie est la suivante :

  • les objets allouent d'abord de la mémoire dans la zone Eden de nouvelle génération

  • Les objets volumineux entrent directement dans l'ancienne génération, principalement des chaînes longues et des tableaux qui nécessitent une grande quantité d'espace mémoire continu

  • objets survivant à long terme ; entrez dans l’ancienne génération. Lorsque la mémoire dans la zone Eden est insuffisante, la JVM lance un MinorGC et l'âge de l'objet est augmenté de un. L'âge par défaut de l'objet atteint 15 et entre dans l'âge ancien ; >Détermination dynamique de l'âge. La somme des tailles de tous les objets du même âge est supérieure à la moitié de l'espace Survivant. Les objets supérieurs ou égaux à cet âge entrent dans l'ancienne génération

  • Le GC nouvelle génération fait référence au GC mineur. La collecte des déchets est effectuée dans la nouvelle génération, fréquemment et rapidement. Le GC d'ancienne génération (Major GC/Full GC) effectue le garbage collection dans l'ancienne génération, généralement accompagné d'au moins un gc mineur. Lent. Le GC complet sera déclenché dans les situations suivantes :

Espace insuffisant dans l'ancienne génération

    Espace insuffisant dans la zone méthode
  1. Appelez System.gc(), il est recommandé que la JVM effectue un gc complet
  2. Transfert long ; -terme objets survivants à l'ancienne génération, espace insuffisant

  3. Il n'y a pas assez d'espace contigu alloué pour les gros objets ;

    Il y a trop d'objets qui survivent à la collecte des ordures dans la nouvelle génération, et S1 ne peut pas les intégrer. L'espace garanti dans l'ancienne génération est insuffisant. L'espace garanti fait référence au fait que l'espace continu maximum disponible soit insuffisant. l'espace de l'ancienne génération est plus grand que l'espace total de tous les objets de la nouvelle génération.
  4. Presque tous les objets sont placés dans le tas, alors comment savoir si ces objets sont toujours utiles ? La JVM propose deux méthodes pour déterminer :

Méthode de comptage de références

 : L'objet ajoute un compteur de référence. Chaque fois qu'il est référencé, la valeur du compteur augmente de un. Lorsque la référence devient invalide, la valeur du compteur diminue de un. Lorsque le nombre de références est de 0, cela signifie que l'objet n'est pas vivant. La méthode de comptage de références ne peut pas résoudre le problème de référence circulaire. Il existe des exemples détaillés dans le livre du professeur Zhou Zhipeng, qui sont relativement faciles à comprendre.
  • Méthode d'analyse de l'accessibilité

  • : En prenant l'objet "GC Roots" comme point de départ, tout comme le nœud racine d'un arbre, chercher vers le bas. Le chemin parcouru par la recherche est appelé chaîne de référence s'il n'y a pas de chaîne de référence depuis un objet jusqu'au départ. point de GC Roots, alors ceci L'objet est inaccessible et doit être recyclé. Les racines GC font référence aux objets référencés par la pile de machines virtuelles, aux objets référencés par la pile de méthodes locale, aux objets référencés par des propriétés statiques dans la zone de méthode et aux objets référencés par des constantes dans la zone de méthode.

Comme mentionné ci-dessus, la survie des objets est liée aux références. Les types de référence sont divisés en références fortes, références douces, références faibles et références virtuelles. Référence forte, objet neuf, l'éboueur ne le recyclera jamais

Références douces, la mémoire de ces objets sera recyclée avant que OMM n'apparaisse dans le système
  • Références faibles, dès que le ramasse-miettes le trouve lorsqu'il l'est ; fonctionne, il sera recyclé immédiatement ;
  • La référence factice est inutile et peut être recyclée à tout moment.

En fait, les objets inaccessibles déterminés par la méthode d'analyse d'accessibilité ne seront pas recyclés immédiatement. L'objet doit être marqué deux fois par avant. il est en fait recyclé . Le premier marquage consiste à juger comme objet inaccessible, puis à effectuer un filtrage. La condition de filtrage est de savoir s'il est nécessaire d'exécuter la méthode finalize() pour cet objet . . Si la méthode finalize() n'est pas remplacée ou si la méthode finalize() a été appelée par la machine virtuelle, la méthode finalize() ne sera appelée qu'une seule fois par le système. Dans les deux cas, il n’y a « pas besoin d’exécuter ». Si nécessaire, cet objet sera placé dans la file d'attente F-Quene, une file d'attente de faible priorité créée automatiquement par la machine virtuelle FinalizerLe thread exécute la méthode finalize(). Durant cette période, le GC effectuera un deuxième marquage à petite échelle sur les objets en F-Quene Si l'objet n'est toujours pas référencé, il le fera. être recyclés. Les objets non filtrés ne sont pas nécessairement recyclés.

Nous savons déjà ce que L'objet est que le temps a été recyclé, alors comment le recycler ? Présentation des quatre algorithmes de collecte des déchets les plus couramment utilisés :

  • Mark-clear : marquez d'abord les objets qui doivent être nettoyés, puis recyclez-les uniformément - pas efficace , générera un grand nombre de fragments discontinus ;

  • Algorithme de copie : divisez la mémoire en blocs et n'utilisez qu'un seul morceau à la fois. objets survivants à un autre Sur une seule pièce

  • Marquage et tri : marquez d'abord les objets survivants, puis déplacez tous les objets survivants vers une extrémité, et nettoyez directement la mémoire en dehors de la limite finale ;

  • Algorithme générationnel, le tas est divisé en la nouvelle génération et l'ancienne génération. Un grand nombre d'objets mourront à chaque fois. la nouvelle génération est collectée, choisissez donc l'algorithme de copie. Le taux de survie de l'ancienne génération est relativement élevé et il n'y a pas d'espace supplémentaire pour la garantie d'attribution, choisissez donc l'algorithme d'effacement des marques ou de tri des marques.

L'algorithme de collecte des ordures est une idée de recyclage de mémoire, et l'implémentation spécifique est un ramasse-miettes. Une brève introduction aux éboueurs couramment utilisés :

  • collecteur série en série. Fil unique, les autres travaux doivent être suspendus pendant la collecte des ordures. Copie pour les nouveaux étudiants, étiquetage pour les anciens. Simple et efficace

  • ParNouveau collecteur. Version multithread de la série ;

  • Parallel Scavenge collector, un collecteur multithread d'algorithme de copie. Faites attention au débit, au temps de code d'exécution du processeur / au temps total du processeur passé. Copie nouvelle génération, tri des marques ancienne génération

  • Série Ancien collector, version ancienne génération

  • Parallel Old collector, l'ancienne version de Parallel Scavenge

  • CMS collector, se concentrant sur la pause la plus courte ; Avec un collecteur simultané, le thread de garbage collection fonctionne (essentiellement) simultanément avec le thread utilisateur. Algorithme de marquage et de balayage

Pour plus de détails sur le éboueur, vous pouvez lire le livre de M. Zhou Zhipeng.

Tutoriel recommandé : "Tutoriel JS"

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:principe nexttick en vueArticle suivant:principe nexttick en vue