Explication détaillée du garbage collection Java et du cycle de vie des objets
Garbage collection et cycle de vie des objets en Java
1 Garbage collection
Le garbage collection est la mémoire en Java. programmation Concept de base de la gestion, le mécanisme de gestion de la mémoire de la JVM est appelé mécanisme de récupération de place.
Après qu'un objet soit créé, il est placé dans la mémoire tas de la JVM. Lorsque cet objet n'est plus référencé, il sera recyclé par la JVM dans la mémoire tas. Les objets créés ne peuvent pas être reproduits et il n'existe aucun moyen de les publier via des instructions de programme. Autrement dit, lorsqu'un objet ne peut pas être atteint (trouvé) via la collection racine dans l'espace d'exécution JVM, l'objet est appelé un objet poubelle. La collection racine est composée de champs de référence statiques et de champs de référence locaux dans la classe. La JVM indexe les objets via la collection racine.
Lors du développement d'applications Java, deux types de mémoire gérés par la JVM sont souvent utilisés : la mémoire tas et la mémoire pile. En termes simples, la mémoire tas est principalement utilisée pour stocker des objets et des variables créés ou instanciés par le programme pendant l'exécution. Par exemple, les objets créés via le mot-clé new. La mémoire de pile est utilisée pour stocker les méthodes déclarées comme statiques ou non statiques dans le code du programme.
(1) Mémoire tas
La mémoire tas est créée au démarrage de la JVM. Les objets stockés dans la mémoire tas peuvent être automatiquement recyclés par la JVM et ne peuvent pas être recyclés par d'autres moyens externes. pour dire que les développeurs ne peuvent pas récupérer les objets dans la mémoire tas en ajoutant du code pertinent. La mémoire tas est généralement divisée en deux zones : la nouvelle zone d’objets et l’ancienne zone d’objets.
Nouvelle zone d'objet : Elle peut être subdivisée en trois petites zones : Zone Eden, Zone De et Zone Vers. La zone Eden est utilisée pour enregistrer les objets nouvellement créés. C'est comme une pile. De nouveaux objets sont créés au fur et à mesure que le pointeur vers la pile grandit. Lorsque les objets de la zone Eden sont pleins, le système JVM sera accessible. La tâche du test sexuel est de détecter quels objets sont inaccessibles depuis la collection racine. Ces objets peuvent être recyclés par la JVM, et tous les objets actifs sont copiés de la zone Eden vers la zone To. À ce stade, certains objets auront un état. Certains objets sont transférés de la zone À vers la zone De. À ce stade, la zone De contient des objets. L'ensemble du processus de migration d'objet ci-dessus est contrôlé par la JVM.
Ancienne zone d'objets : les objets de l'ancienne zone d'objets auront toujours un long cycle de vie. La plupart des objets indésirables du système JVM proviennent d'objets « de courte durée ». Après un certain temps, ce sont des objets transférés vers le. les anciennes zones d'objets deviennent des objets poubelles. À ce stade, ils sont tous marqués en conséquence et le système JVM recyclera automatiquement ces objets indésirables. Il est recommandé de ne pas forcer le système à effectuer fréquemment un garbage collection. En effet, la JVM utilisera des ressources système limitées pour effectuer le travail de garbage collection. d'abord, ce qui entraîne application L'incapacité de répondre rapidement aux demandes du côté utilisateur affectera les performances globales du système.
(2) Mémoire de pile
La mémoire tas est principalement utilisée pour stocker des objets et des variables créés ou instanciés par le programme pendant l'exécution. Par exemple, les objets créés via le mot-clé new. La mémoire de pile est utilisée pour stocker les méthodes déclarées comme statiques ou non statiques dans le code du programme.
2. Cycle de vie des objets dans JVM
Dans l'espace d'exécution JVM, l'ensemble du cycle de vie d'un objet peut être grossièrement divisé en 7 étapes :
Phase de création ;
Phase de candidature ;
Phase invisible ;
Phase inaccessible ;
Phase de collection ; >
Phase de sortie Les 7 étapes ci-dessus constituent le cycle de vie complet des objets dans la JVM. (1) Phase de création Dans la phase de création d'objet, le système termine principalement le processus de création d'objet à travers les étapes suivantes : f35d6e602fd7d0f0edfa6f7d103c1b57 l'objet alloue de l'espace de stockage ; 2cc198a1d5eb0d3eb508d858c9f5cbdb Commencer à construire l'objet ; Appeler récursivement le constructeur de la super-classe
43ad812d3a971134e40facaca816c822 est appelé.
Vous devez faire attention à plusieurs règles d'application clés lors de la création d'objets :
& lt; 2 & gt; essayez de faire en sorte que l'objet réponde à la norme de recyclage des déchets à temps. Par exemple monObjet = null.
L'accès aux variables locales est préférable à l'accès aux variables de la classe.
Lors de la phase de référence d'objet, l'objet présente les caractéristiques suivantes :
f35d6e602fd7d0f0edfa6f7d103c1b57 Le système maintient au moins une référence forte (Strong Reference) de l'objet
import java.lang.ref.SoftReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为soft引用类型,并且释放强引用 SoftReference sr = new SoftReference(a); a = null; ... // 下次使用时 if (sr != null) { a = sr.get(); } else { // GC由于低内存,已释放a,因此需要重新装载 a = new A(); sr = new SoftReference(a); }L'introduction de la technologie de référence logicielle permet aux applications Java de mieux gérer la mémoire, de stabiliser le système, d'empêcher le débordement de la mémoire système et d'éviter le système tombe en panne. Par conséquent, cette technologie doit être appliquée autant que possible lorsqu'il s'agit d'objets qui occupent une grande quantité de mémoire et ont un long cycle de vie, mais qui ne sont pas fréquemment utilisés. Améliorer la stabilité du système.
import java.lang.ref.WeakReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为Weak引用类型,并且释放强引用 WeakReference wr = new WeakReference(a); a = null; ... // 下次使用时 if (wr != null) { a = wr.get(); } else { a = new A(); wr = new WeakReference(a); }Phantom Reference : Phantom Reference a moins d'utilisations et est principalement utilisé pour aider à l'utilisation de la fonction de finalisation. Les objets Phantom Reference font référence à des objets qui ont fini d'exécuter la fonction de finalisation et sont des objets inaccessibles, mais qui n'ont pas encore été recyclés par GC. Ce type d'objet peut aider à finaliser certains travaux de recyclage ultérieurs. Nous avons amélioré la flexibilité du mécanisme de recyclage des ressources en remplaçant la méthode clear() de Reference. Dans la programmation réelle, les références faibles et les références virtuelles sont rarement utilisées. Les références logicielles sont plus souvent utilisées, car les références logicielles peuvent accélérer la récupération de la mémoire indésirable par la JVM et maintenir la sécurité du système. comme un débordement de mémoire (OutOfMemory). (3) Étape invisible
visible.
try { Object localObj = new Object(); localObj.doSomething(); } catch (Exception e) { e.printStackTrace(); } if (true) { // 此区域中localObj 对象已经不可视了, 编译器会报错。 localObj.doSomething(); }(4) Étape inaccessible