Maison  >  Article  >  Java  >  Java explique en détail le garbage collection et le cycle de vie des objets

Java explique en détail le garbage collection et le cycle de vie des objets

高洛峰
高洛峰original
2017-01-17 15:50:541496parcourir

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.

& lt; 3 & gt; N'adoptez pas de niveaux d'héritage trop profonds.

                                                                                                                                                                                                                           L'accès aux variables locales est préférable à l'accès aux variables de la classe.

(2) Étape de candidature

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

; Toutes les références à l'objet sont des références fortes (sauf si nous appliquons explicitement : Soft Reference, Weak Reference ou Phantom Reference

Strong Reference ( Strong Reference) : fait référence au gestionnaire de mémoire JVM parcourant tous les chemins vers). objets dans le tas à partir de la collection de référence racine. Lorsqu'un chemin vers un objet ne contient pas d'objet de référence, la référence à l'objet est appelée une référence forte.

Soft Reference : La principale caractéristique de la référence logicielle est sa fonction de référence forte. Ce type de mémoire n'est récupéré que lorsqu'il n'y a pas assez de mémoire, ils ne sont donc généralement pas récupérés lorsqu'il y a suffisamment de mémoire. De plus, il est garanti que ces objets de référence seront définis sur null avant que Java ne génère une exception OutOfMemory. Il peut être utilisé pour mettre en cache certaines ressources couramment utilisées et implémenter la fonction Cache pour garantir une utilisation maximale de la mémoire sans provoquer de OutOfMemory.

Ce qui suit est le code d'implémentation de la référence logicielle :

        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.


Référence faible : la plus grande différence entre les objets d'application faibles et les objets de référence logicielles est que lorsque GC effectue un garbage collection, il doit utiliser un algorithme pour vérifier s'il doit recycler les objets d'application logicielles, et pour les références faibles. , GC collecte toujours. Les objets de référence faibles sont plus faciles et plus rapides à recycler par GC. Les objets de référence faibles sont souvent utilisés dans les structures Map.

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


Lorsqu'un objet est dans l'étape invisible, cela signifie qu'on ne peut plus le référencer dans d'autres zones du code, et sa référence forte a disparu . Par exemple, une variable locale dépasse sa portée

visible.

try {  
      Object localObj = new Object();  
  localObj.doSomething();  
   } catch (Exception e) {  
     e.printStackTrace();  
   }  
  
   if (true) {  
  // 此区域中localObj 对象已经不可视了, 编译器会报错。  
  localObj.doSomething();  
   }
(4) Étape inaccessible


Les objets dans l'étape inaccessible ne peuvent plus trouver de références fortes directes ou indirectes dans la collection racine de référence d'objet de la machine virtuelle, celles-ci. les objets sont généralement des variables temporaires dans toutes les piles de threads. Toutes les variables statiques chargées ou les références aux interfaces de code natif.

(5) Phase de collection, phase finale et phase de sortie


Lorsqu'un objet est en phase de collection, phase finale et phase de sortie, l'objet présente les trois situations suivantes :

  f35d6e602fd7d0f0edfa6f7d103c1b57 Le collectionneur a constaté que l'objet n'est plus accessible.

2cc198a1d5eb0d3eb508d858c9f5cbdb La méthode finalize a été exécutée.

  5bdf4c78156c7953567bb5a0aef2fc53 L'espace objet a été réutilisé.


Merci d'avoir lu, j'espère que cela pourra vous aider, merci pour votre soutien à ce site !

Pour plus d'articles sur l'explication détaillée de Java sur le garbage collection et le cycle de vie des objets, veuillez prêter attention au site Web PHP chinois !

Déclaration:
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