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 : <1> l'objet alloue de l'espace de stockage ; <2> Commencer à construire l'objet ; Appeler récursivement le constructeur de la super-classe
<5> 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 :
<1> 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); }
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); }
visible.
try { Object localObj = new Object(); localObj.doSomething(); } catch (Exception e) { e.printStackTrace(); } if (true) { // 此区域中localObj 对象已经不可视了, 编译器会报错。 localObj.doSomething(); }