Maison  >  Article  >  Java  >  Java Learning Jvm Garbage Collector (Bases)

Java Learning Jvm Garbage Collector (Bases)

青灯夜游
青灯夜游avant
2018-10-16 16:14:442229parcourir

Cet article vous présentera le garbage collector Jvm (bases) pour l'apprentissage Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

1 : Présentation

Dans cet article « Zone de données d'exécution Jvm » présente diverses parties de la zone d'exécution de la mémoire Java, notamment le compteur de programme, la pile de machines virtuelles et la pile de méthodes locales. les zones survivent à mesure que le fil survit. L'allocation et la désallocation de mémoire sont déterministes. La mémoire est naturellement recyclée à la fin du thread, il n'est donc pas nécessaire d'envisager le garbage collection. Le tas Java et la zone de méthode sont différents. Ils sont partagés par chaque thread, et l'allocation et le recyclage de la mémoire sont dynamiques. Par conséquent, le garbage collector se concentre sur cette partie de la mémoire.

Ensuite, nous discuterons de la manière dont Jvm récupère cette mémoire. La première chose que fait le ramasse-miettes avant le recyclage est de déterminer quels objets sont encore vivants et lesquels sont morts. Deux algorithmes de recyclage de base sont présentés ci-dessous.

1.1 Algorithme de comptage de références

Ajouter un compteur de référence à l'objet Chaque fois qu'il y a une référence à celui-ci, le compteur sera +1, et lorsque la référence est invalide, le compteur sera. -1. Tant que le compteur est égal à 0, l'objet ne peut plus être utilisé.

Cet algorithme est un bon choix dans la plupart des cas, et il existe des cas d'application célèbres. Mais il n'est pas utilisé dans la machine virtuelle Java.

Avantages : Mise en œuvre simple et efficacité de jugement élevée.

Inconvénients : Il est difficile de résoudre le problème des références circulaires entre objets. Par exemple, l'exemple suivant

Object a = new Object(); 
Object b = new Object(); 
a=b; 
b=a; 
a=b=null; //这样就导致gc无法回收他们。  

1.2 L'algorithme d'analyse d'accessibilité

utilise une série d'objets appelés « Racines GC » comme point de départ et recherche vers le bas à partir de ces nœuds le chemin parcouru. est appelée chaîne de référence Lorsqu'un objet n'utilise aucune chaîne de référence aux racines GC, cela signifie que l'objet n'est pas disponible.

Dans les implémentations grand public des langages de programmation commerciaux traditionnels (Java, C#, etc.), l'analyse d'accessibilité est utilisée pour déterminer si un objet est vivant.

À travers la figure suivante, vous pouvez clairement ressentir le lien entre la racine gc et l'affichage de l'objet. Les objets de la zone grise affichés sont vivants et les Objets 5/6/7 sont tous des objets recyclables

En langage Java, les objets pouvant être utilisés comme racines GC incluent les types 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 des variables statiques dans la zone de méthode

  • Objets référencés par des constantes dans la zone des méthodes

  • Objets référencés par JNI dans la pile de méthodes locale (en général méthodes natives)

Avantages : plus précis et rigoureux, peut analyser la référence mutuelle des structures de données cycliques

Inconvénients : la mise en œuvre est plus complexe et nécessite L'analyse d'une grande quantité de données prend beaucoup de temps et le processus d'analyse nécessite des pauses GC (les relations de référence ne peuvent pas changer), c'est-à-dire l'arrêt de tous les threads d'exécution Java (appelé "Stop The World", ce qui est un problème clé de déchets collection).

2 : Référence

Après jdk1.2, Java a élargi le concept de référence, qui est généralement divisé en quatre catégories : référence forte, référence douce, référence faible et référence virtuelle. Quatre L'intensité des citations s'affaiblit progressivement.

  • Référence forte  : fait référence aux références courantes dans le code, telles que Object obj = new Object(); Seules les références fortes sont encore disponibles existe, le GC ne collectera jamais l'objet référencé .

  • Référence douce : fait référence à certains objets utiles mais pas nécessaires. Il ne sera pas récupéré tant qu'il n'y aura pas assez d'espace mémoire (avant que OutOfMemoryError ne soit généré). Utilisez la classe SoftReference pour implémenter des références souples

  • Référence faible  : utilisée pour décrire des éléments non essentiels objets. Ces objets seront recyclés lors du travail du éboueur. Utilisez la classe WeakReference pour implémenter des références faibles.

  • Référence virtuelle : Si un objet a une référence virtuelle, Cela n'affectera pas du tout sa durée de survie. Le seul but est de recevoir une notification système lorsque l'objet est recyclé. Utilisez la classe PhantomRenference pour implémenter

2.1 Déterminer un objet. Vivre ou mourir

Pour déclarer un objet mort, il faut qu'il soit marqué au moins deux fois.

1. Première marque

Si l'objet ne trouve pas de chaîne de référence connectée à GC Roots après l'algorithme d'analyse d'accessibilité, il sera marqué pour la première fois Mark et filtrer une fois.

Conditions de filtrage : Déterminez si cet objet doit exécuter la méthode finalize().

Filtrer les résultats : Lorsque l'objet ne couvre pas la méthode finalize(), ou que la méthode finalize() a été exécutée par la JVM, il est déterminé comme étant un objet recyclable. S'il est nécessaire que l'objet exécute la méthode finalize(), il sera placé dans la file d'attente F-Queue. Cette méthode sera déclenchée plus tard dans le thread Finalizer de faible priorité créé automatiquement par la JVM (éventuellement plusieurs threads)

2 La deuxième marque

GC dans la file d'attente F-Queue L'objet est. marqué deux fois.

Si l'objet est réassocié à un objet de la chaîne de référence dans la méthode finalize(), il sera supprimé de la collection "Sur le point d'être recyclé" lors du deuxième marquage. Si l'objet ne s'est pas échappé avec succès à ce moment-là, il ne peut être que recyclé.

3. Méthode finalize()

finalize() est une méthode de la classe Object. La méthode finalize() d'un objet ne sera automatiquement appelée qu'une seule fois par le système. la mort via la méthode finalize() ne sera pas appelée une deuxième fois ;

Remarque : il n'est pas recommandé d'appeler finalize() dans le programme pour l'auto-sauvetage. Il est recommandé d'oublier l'existence de cette méthode dans les programmes Java. Parce que son temps d'exécution est incertain, et même s'il est exécuté est incertain (sortie anormale du programme Java), et que le coût d'exécution est élevé, et que l'ordre d'appel de chaque objet ne peut pas être garanti (même appelé dans différents threads ).

3 : Zone méthode de recyclage

Le garbage collection de la génération permanente est principalement divisé en deux parties : Constantes abandonnées et classes inutiles.

3.1 Recyclage des constantes supprimées

Le recyclage des constantes supprimées est similaire au recyclage du tas Java. Voici un exemple pour illustrer

Supposons qu'une chaîne "abc" soit entrée dans le pool de constantes, mais que le système actuel n'ait pas d'objet chaîne appelé abc, c'est-à-dire qu'il n'y a aucune référence à l'objet chaîne pointant vers le pool constant. abc constant, et il n’est pas nécessaire de faire référence à ce littéral ailleurs. Si un recyclage de mémoire se produit, la constante abc sera effacée du pool de constantes. Les références symboliques des autres classes (interfaces), méthodes et champs du pool de constantes sont similaires à celles-ci.

3.2 Recyclage des classes inutiles

Une classe doit remplir les trois conditions suivantes en même temps pour être considérée comme inutile.

  1. Toutes les instances de cette classe ont été recyclées, c'est-à-dire qu'il n'y a aucune instance reclassée dans le tas Java.

  2. Le ClassLoader qui a chargé cette classe a été recyclé.

  3. L'objet java.lang.Class correspondant à cette classe n'est référencé nulle part, et les méthodes de cette classe ne sont accessibles par réflexion nulle part

La machine virtuelle peut recycler les classes qui remplissent ces trois conditions en même temps, mais elle n'est pas obligée de les recycler. Que ce soit pour recycler les classes, la machine virtuelle HotSpot fournit le paramètre -Xnoclassgc à contrôler.

Résumé : Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun. Pour plus de didacticiels connexes, veuillez visiter le Tutoriel vidéo Java, le Tutoriel graphique de développement Java, le Tutoriel vidéo bootstrap !

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