Maison Java javaDidacticiel Explication détaillée du marquage des objets recyclés en Java et du processus de marquage secondaire des objets

Explication détaillée du marquage des objets recyclés en Java et du processus de marquage secondaire des objets

Oct 11, 2017 am 10:12 AM
java 标记

Cet article présente principalement le contenu pertinent du marquage des objets de recyclage Java et le processus de marquage secondaire des objets. L'éditeur pense que c'est plutôt bien. Je le partagerai avec vous ici. Les amis qui en ont besoin peuvent s'y référer.

1. Marquage des objets

1. Qu'est-ce qu'une marque ? Comment marquer ?

Je crois que tout le monde connaît la première question. Le marquage consiste à marquer certains objets morts pour faciliter le nettoyage de la poubelle. Quant à la manière de marquer, il existe généralement deux méthodes : le comptage de références et l'analyse d'accessibilité.

Le comptage de références est relativement simple à mettre en œuvre. Il s'agit d'ajouter un compteur de références à l'objet. Chaque fois qu'il y a une référence à celui-ci, il sera augmenté de 1. Lorsque la référence est invalide, elle sera augmentée. sera décrémenté de 1. Lorsque le compteur est à 0, marqué pour le recyclage. Ce jugement est très efficace, mais de nombreuses machines virtuelles grand public n'utilisent pas cette méthode, principalement parce qu'il est difficile de résoudre le problème des références circulaires entre plusieurs objets. Même si elle n'est pas beaucoup utilisée, elle vaut quand même la peine d'être apprise !


public class Test {
private Object obj;
Public static void main(){
Test t1=new Test();
Test t2=new Test();
t1.obj=t2;
t2.obj=t1;
t1=null;
t2=null;
//如果对象在这行发生gc,那么t1和t2对象是否能被回收
System.gc();
}
}
Copier après la connexion

L'idée de base de l'analyse d'accessibilité est la suivante : en utilisant certains objets appelés "GC Roots" comme point de départ, commencez la recherche à partir de ces nœuds , recherchez des objets qui ont une relation de référence directe ou indirecte avec le nœud, et combinez ces objets sous forme de chaînes pour former un « réseau de relations », également appelé chaîne de référence. Enfin, le garbage collector collecte certains objets qui ne font pas partie de ce réseau de relations. Comme le montre l'image :

L'objet connecté à l'objet GC Roots est un objet qui est définitivement encore vivant, et l'objet dé à droite n'a rien à voir avec GCROOTS, ce sera donc marqué comme objet recyclable. Actuellement, les machines virtuelles commerciales grand public utilisent des méthodes similaires. Alors, quels objets peuvent être utilisés comme « racines GC » ? En Java, il existe quatre types d'objets qui peuvent être utilisés comme objets de référence dans "GC Roots"

1 : Stack frame (nom au chapitre 1). (Dans la pile)

2 : Objet référencé par des propriétés statiques. (Dans la zone méthode)

3 : Objet référencé par constante. (Dans la zone méthode)

4 : Objet référencé par JNI dans la pile de méthodes locale. (Dans la pile de méthodes locale)

2. Recyclage secondaire des objets

J'ai dit que l'objet est marqué, mais ce n'est pas le cas signifie qu'il est marqué. Sera-t-il définitivement recyclé ? Je ne sais pas si vous vous souvenez que la classe Object a une méthode finalize(). Toutes les classes héritent de la classe Object, cette méthode est donc implémentée par défaut.

Le principe de fonctionnement de finalize devrait être le suivant : une fois que le ramasse-miettes est prêt à libérer l'espace de stockage occupé par l'objet, il appelle d'abord finalize(), et seulement lors du prochain processus de ramasse-miettes. , cela va-t-il vraiment récupérer la mémoire de l'objet. Donc, si vous utilisez finalize(), vous pouvez effectuer un travail de nettoyage ou de nettoyage important pendant le ramasse-miettes
Quand finalize() est-il appelé ?

<.>Il existe trois situations

1. Tous les objets sont automatiquement appelés lorsqu'ils sont récupérés, par exemple lors de l'exécution de System.gc().


2. Le programme se termine. La méthode finalize est appelée une fois pour chaque objet.


3. Appeler explicitement la méthode finalize


Le but de cette méthode est : avant que l'objet ne soit recyclé, la méthode finalize() de l'objet sera appelée. . Le recyclage fait référence ici après avoir été marqué. Le problème réside ici. Existe-t-il une situation où un objet n'est plus dans le "réseau de relations" (chaîne de référence) mentionné dans le chapitre précédent, mais après que le développeur a réécrit la finalisation. (), et a rajouté l'objet au « réseau de relations », c'est-à-dire que l'objet nous est toujours utile et ne doit pas être recyclé, mais il a été marqué. Que devons-nous faire ?

Pour résoudre ce problème, l'approche de la machine virtuelle consiste à marquer les objets deux fois, c'est-à-dire à marquer pour la première fois les objets qui ne sont pas dans le « réseau de relations ». Pour la deuxième fois, il faut d'abord déterminer si l'objet a implémenté la méthode finalize(). S'il n'a pas été implémenté, il sera directement déterminé que l'objet est recyclable s'il a été implémenté, il sera placé ; dans une file d'attente d'abord, et un niveau bas créé par la machine virtuelle l'exécutera, puis un deuxième marquage à petite échelle sera effectué. Cette fois l'objet marqué sera effectivement recyclé.


Résumé : Pour faire simple, l'objet est marqué pour la première fois, et la méthode finalize() de l'objet sera exécutée avant le prochain GC. Lors de l'exécution de la méthode finalize(), il est jugé si l'objet a implémenté la méthode finalize(). S'il n'est pas implémenté, il est effacé directement s'il est implémenté, l'objet est placé dans une file d'attente pour exécuter la méthode finalize ; et marqué pour la deuxième fois
dans l'algorithme de recherche racine Java Pour déterminer l'accessibilité des objets, les objets inaccessibles ne doivent pas nécessairement être nettoyés. Il y a une période de probation à ce moment-là. Pour vraiment juger qu'un objet est mort, il doit passer par au moins deux processus de marquage : Si l'objet constate qu'il n'y a pas de chaîne de référence associée aux racines GC après avoir effectué une recherche de racine, il le fera. être marqué pour la première fois et marqué. Une fois filtré, la condition de filtrage est de savoir s'il est nécessaire que cet objet exécute la méthode finalize() Lorsque l'objet ne couvre pas la méthode finalize(), ou la méthode finalize(. ) a été appelée par la machine virtuelle , la machine virtuelle sera dans tous les cas considérée comme "Il n'est pas nécessaire d'exécuter ".

C'est-à-dire que lorsqu'un objet remplace la méthode finalize(), l'objet est jugé nécessaire pour exécuter la méthode finalize(), puis l'objet est placé dans la file d'attente F-Queue, et Il sera exécuté ultérieurement par un thread Finalizer de faible priorité créé automatiquement par la machine virtuelle. Ce qu'on appelle ici l'exécution signifie que la machine virtuelle démarre cette méthode, mais ne promet pas d'attendre la fin de son exécution. La raison en est : si un objet s'exécute lentement dans la méthode finalize(), ou si une boucle infinie se produit (dans des cas extrêmes), cela peut amener d'autres objets de la file d'attente F-Queue à être en attente permanente, ou même provoquer toute la mémoire du système de recyclage plante. La méthode finalize() est la dernière chance pour l'objet d'échapper au sort de la mort. Plus tard, le GC marquera l'objet dans la file d'attente F pour une seconde petite échelle si l'objet veut réussir à se sauvegarder dans finalize(). ---- tant qu'il suffit de le réassocier à quoi que ce soit sur la chaîne de référence, il sera alors supprimé de la collection "sur le point d'être recyclé" lorsqu'il sera marqué pour la deuxième fois si l'objet ne s'échappe pas à ce moment-là ; temps, il sera recyclé. Exemple de code : reportez-vous au chapitre correspondant de « Compréhension approfondie de la machine virtuelle Java »

Résumé

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

PHP vs Python: comprendre les différences PHP vs Python: comprendre les différences Apr 11, 2025 am 12:15 AM

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

PHP: un langage clé pour le développement Web PHP: un langage clé pour le développement Web Apr 13, 2025 am 12:08 AM

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles