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.
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.
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无法回收他们。
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).
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
Pour déclarer un objet mort, il faut qu'il soit marqué au moins deux fois.
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)
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é.
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 ).
Le garbage collection de la génération permanente est principalement divisé en deux parties : Constantes abandonnées et classes inutiles.
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.
Une classe doit remplir les trois conditions suivantes en même temps pour être considérée comme inutile.
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.
Le ClassLoader qui a chargé cette classe a été recyclé.
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!