Ce tutoriel consiste à comprendre la collection de garbage Java de base et son fonctionnement. Ceci est la deuxième partie de la série de tutoriels de collection Garbage. J'espère que vous avez lu la première partie: " Une brève introduction au mécanisme de collecte des ordures Java ".
Java Garbage Collection est un processus automatisé utilisé pour gérer la mémoire d'exécution utilisée par les programmes. Grâce à ce processus d'automatisation, le JVM supprime les frais généraux des programmeurs pour allouer et librement des ressources de mémoire dans le programme.
Démarrer la collection Java Garbage
En tant que processus automatique, les programmeurs n'ont pas besoin de démarrer le processus de collecte des ordures affiché dans le code. System.gc () et Runtime.gc () sont utilisés pour demander au JVM de commencer la collecte des ordures.
Bien que ce mécanisme de demande offre aux programmeurs la possibilité de démarrer le processus GC, la startup est la responsabilité du JVM. Le JVM peut rejeter cette demande, il n'y a donc aucune garantie que tous ces appels effectueront la collecte des ordures. Le choix du synchronisation des startups est déterminé par le JVM et dépend si la zone Eden est disponible dans la mémoire du tas. Le JVM laisse ce choix à l'implémentation de la spécification Java, et les algorithmes spécifiques utilisés par différentes implémentations sont différents.
Inutile de dire que nous savons que le processus de collecte des ordures ne peut pas être appliqué. Je viens de trouver une scène où appeler System.gc () a du sens. Grâce à cet article, découvrons les situations extrêmes qui conviennent à l'appel System.gc () .
Processus de collecte des ordures Java
La collection Garbage est un processus de récupération de l'espace mémoire inutile et de la mettre à la disposition des futures instances.
Area Eden: Lorsqu'une instance est créée, elle sera d'abord stockée dans la zone Eden de la jeune génération de mémoire de tas.
Remarque: Si vous ne pouvez pas comprendre ces mots, je vous suggère de lire cette introduction à la collection Garbage, qui fournit une introduction détaillée aux modèles de mémoire, aux architectures JVM et à ces termes.
Zones de survivants (S0 et S1): Dans le cadre du cycle de GC GC (mineur), l'objet survivant (toujours référencé) est déplacé de la zone Eden à S0 de la zone de survivante. De même, le collecteur des ordures scanne S0 et déplace l'instance survivante dans S1.
(Note du traducteur: les gens survivants d'Eden et de S0 ne passent-ils pas à S1? Pourquoi se déplacent-ils d'abord à S0 puis de S0 à S1?)
Une instance de décès (non référencée) est marquée comme une collecte des ordures. Selon le collecteur des ordures (il y a quatre collectionneurs de déchets couramment utilisés, qui seront décrits dans le tutoriel suivant), soit les instances marquées sont constamment supprimées de la mémoire, soit le processus de recyclage est terminé dans un processus distinct.
Génération plus ancienne: la génération plus âgée est la deuxième zone logique de la mémoire du tas. Lorsque le collecteur des ordures effectue le cycle mineur, l'instance survivante dans la zone S1-Survivor sera promue à la vieillesse, tandis que les objets non référencés sont marqués comme recyclés.
Old GC (MajorGC): Par rapport au processus de collecte des ordures Java, Old GC est la dernière étape du cycle de vie de l'instance. MajorGC scanne le processus de recyclage des ordures des personnes âgées. Si les instances ne sont plus référencées, elles sont marquées comme recyclées, sinon ils continueront à rester dans la vieillesse.
Mémoire: une fois qu'une instance est supprimée de la mémoire du tas, son emplacement devient vide et peut être utilisé pour l'allocation des instances futures. Ces espaces libres fragmenteront toute la zone de mémoire. Pour une allocation rapide des instances, une défragmentation est requise. Sur la base des différents choix du collecteur des ordures, la zone de mémoire recyclée est soit réglée ou terminée en constante évolution dans un processus GC séparé.
Fin des instances dans la collection des ordures
Avant de libérer une instance et de récupérer l'espace mémoire, le collectionneur Java Garbage appelle la méthode Finalize () respective de l'instance, afin que l'instance ait la possibilité de libérer les ressources qu'il détient. Bien qu'il soit garanti que Finalize () sera appelé avant de récupérer l'espace mémoire, il n'y a pas d'ordre et de temps spécifié. L'ordre entre plusieurs instances est imprévisible et peut même se produire en parallèle. Les programmes ne doivent pas pré-régler l'ordre entre les instances et recycler les ressources à l'aide de la méthode finaliser ().
Toutes les exceptions qui ne sont pas prises dans le processus Finalize seront automatiquement ignorées et le processus de finalisation de l'instance est annulé.
La spécification JVM ne discute pas du mécanisme de collecte des ordures pour les références faibles, ni des exigences claires. La mise en œuvre spécifique est déterminée par la partie de mise en œuvre.
La collecte des ordures est réalisée par un fil de démon.
Quand l'objet remplira-t-il les conditions de collecte des ordures?
Toutes les instances n'ont pas d'accès actif au fil.
Une instance de référence circulaire qui n'est accessible par aucune autre instance.
Il existe différents types de référence en Java. Déterminer si une instance répond aux conditions de collecte des ordures dépend toutes de son type de référence.
| Type de référence | Collection des ordures |
|---|---|
| Forte référence | Pas en conformité avec la collection des ordures |
| Référence douce | La collection à ordures peut être effectuée, mais sera un dernier recours |
| Référence faible | Respectez la collection des ordures |
| Référence fantôme | Respectez la collection des ordures |
En tant que technique d'optimisation pendant le processus de compilation, le compilateur Java peut choisir d'attribuer des valeurs nulles aux instances, marquant ainsi l'instance comme recyclable.
classe Animal {public static void main (String [] args) {Animal Lion = New Animal (); System.out.println ("Main est terminé."); } protégé void finalize () {System.out.println ("Rest in Peace!"); }}Dans la classe ci-dessus, l'objet Lion n'a jamais été utilisé après avoir instancié la ligne. Par conséquent, en tant que mesure d'optimisation, le compilateur Java peut attribuer directement Lion = NULL après avoir instancié la ligne. Par conséquent, la fonction finalisée peut imprimer 'Restinpeace!' Même avant la sortie SOP. Nous ne pouvons pas prouver que cela se produira car cela dépend de la façon dont le JVM est implémenté et de la mémoire utilisée par l'exécution. Cependant, nous pouvons en apprendre un de plus: si le compilateur voit que l'instance ne sera jamais référencée à l'avenir, il peut sélectionner et libérer un espace d'instance tôt.
Il y a un meilleur exemple de lorsque les objets sont conformes à la collecte des ordures. Tous les attributs de l'instance peuvent être stockés dans des registres, qui seront ensuite accessibles et lus. Sans exception, ces valeurs seront écrites à l'instance. Bien que ces valeurs puissent être utilisées à l'avenir, cette instance peut toujours être marquée comme conforme à la collecte des ordures. C'est un exemple très classique, n'est-ce pas?
Ceci est un exemple très simple qui est conforme à la collecte des ordures lorsqu'il est affecté à Null. Bien sûr, les situations complexes peuvent être comme les points ci-dessus. Il s'agit d'un choix fait par l'implémentateur JVM. Le but est de laisser la plus petite empreinte mémoire que possible, d'accélérer la vitesse de réponse et d'améliorer le débit. Pour y parvenir, les implémenteurs JVM peuvent choisir une meilleure solution ou un meilleur algorithme pour récupérer l'espace mémoire pendant le processus de collecte des ordures.
Lorsque la méthode finaliser () est appelée, le JVM libère tous les verrous de synchronisation sur le thread.
Programme d'échantillon GCSCOPE
Classe GCSCOPE {GCSCOPE T; statique int i = 1; public static void main (String args []) {gcscope t1 = new gcscope (); gcscope t2 = nouvel gcscope (); gcscope t3 = new gcscope (); // aucun objet n'est éligible pour gct1.t = t2; // L'objet est éligible pour gct3.t = t1; // aucun objet n'est éligible pour gct1 = null; // aucun objet n'est éligible pour GC (t3.t a toujours une référence à t1) t2 = null; // aucun objet n'est éligible pour GC (T3.TT a toujours une référence à T2) T3 = nul Les objets se référent mutuellement de manière arrondie formant l'île d'objets sans aucune référence externe //)} protégée void finalize () {System.out.println ("Garbage collecté à partir de l'objet" + i); i ++;} classe GCScope {gcscope t; static int i = 1; public static void main Gcscope (); gcscope t2 = new gcscope (); gcscope t3 = new gcscope (); // aucun objet se conforme à gct1.t = t2; // aucun objet se conforme à gct2.t = t3; // aucun objet se conforme à gct3.t = t1; // aucun objet ne respecte pas à gct1 = null; // t1) t2 = null; // aucun objet se conforme à gc (t3.tt a toujours une référence à t2) t3 = null; // tous les trois objets se conforment à GC (aucun d'entre eux n'a une référence. // seule la variable t de chaque objet pointe également les uns vers les autres, // forment une île Ring composée d'objets sans références externes. collecté à partir de l'objet "+ i); i ++;}Programme d'échantillon GC OutOfMemoryError
GC ne garantit pas la sécurité des problèmes de débordement de la mémoire, et le code insuffisant écrit provoquera une orientororror.
import java.util.linkedlist; import java.util.list; public class gc {public static void main (string [] main) {list l = new LinkedList (); // entrez une boucle infinie qui ajoutera une chaîne à la liste: l sur chacun // itation.do {l.add (new String ("Hello, world"));} while (true);}Sortir:
Exception dans Thread "Main" java.lang.outofMemoryError: Java Heat Space à java.util.linkedlist.linklast (LinkedList.java:142) sur java.util.linkedlist.add (linkedlist.java:338) à com.javapers.java.gccspe
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur la discussion brièvement du processus de mise en œuvre de la collection Java Garbage. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!