Qu'est-ce que Java Garbage Collector?
Le garbage collector est un thread démon qui libère de la mémoire pendant l'exécution. La collecte des déchets peut également être exprimée comme un recyclage de la mémoire. Surtout en JVM, le ramasse-miettes Oracle Hotspot est utilisé en raison de son efficacité. La zone de mémoire dans JVM où les objets sont créés est appelée tas. Le tas est divisé en deux parties:
- Espace jeune génération
- Espace de génération ancien / ancien
La jeune génération est à nouveau divisée en 3 parties
- Espace Eden
- Survivant de
- Survivor To
Une explication plus approfondie a été donnée dans les points suivants. Par exemple, si vous avez créé un cache dans votre programme et si l'objet cache a survécu à de nombreux cycles de GC, il passe à l'ancienne génération. Le GC recherche les objets dont le programme n'a plus besoin et les détruit.
Pourquoi Garbage Collector?
Avant Java, deux des langages les plus populaires étaient le C et le C ++. En C, nous avons rencontré calloc (), malloc (), realloc () qui alloueront de la mémoire tampon et en C ++, nous avons des destructeurs. Toutes ces fonctions concernent la fonction appelée gestion de la mémoire. Java fournit le garbage collector comme gestion automatique de la mémoire pour les deux principales raisons:
- Certains objets créés deviennent inaccessibles
- Les références des objets anciens aux objets jeunes n'existent qu'en petit nombre.
La meilleure pratique pour utiliser un garbage collector est de définir des indicateurs sur JVM.
Permettez-moi de vous donner un exemple pour les objets inaccessibles
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
Dans l'exemple ci-dessus, Java créera un objet chaîne et la portée de cet objet est juste si le bloc ne peut pas être utilisé à l'extérieur. Ainsi, lorsque le garbage collection s'exécute sur cette classe, il marquera 's' comme objet inaccessible et inutilisé et le supprimera.
Fonctions dans Garbage Collector
- Marquer: démarre à partir du nœud racine de votre application (principal), parcourt le graphe des objets, marque les objets accessibles à vie.
- Supprimer / Balayer: supprimez les objets inaccessibles. Lorsque le GC supprime des objets, il crée un trou dans le tas le rendant incohérent. Ainsi, le compactage est utilisé.
- Compactage: Compactez la mémoire en vous déplaçant autour des objets et en marquant l'allocation contiguë plutôt que fragmentée. C'est une tâche qui prend du temps.
Comment fonctionne Java Garbage Collector?
- Il existe deux types d'objet:
Objets dynamiques : accessibles (références d'un autre objet)
Objets morts: inaccessibles (non référencés de n'importe où)
- Tous les objets nouvellement créés sont créés dans l'espace Eden (espace Young Generation).
- Une fois que l'espace Eden est plein, un programme mineurGC () s'exécute sur l'espace Young Generation qui marque tous les objets inutilisés ou morts et les balaie de la mémoire.
- Les objets qui ont survécu à ce cycle GC seront déplacés vers Survivor From space. Le même processus se répète et cette fois, lorsque les objets sont déplacés de l'espace Eden vers Survivor. De l'espace, GC vérifie s'il est plein, les objets morts sont libérés et les objets survivants seront également déplacés vers Survivor.
- Ce processus est répété et si certains objets ont survécu à un certain nombre de cycles GC, ces objets sont déplacés vers l'espace Old Generation.
- Dans ce scénario, JVM exécute la fonction majorGC () qui parcourt l'espace de tas complet, identifie / marque les objets inutilisés (nuls ou morts) et balaye tous ces objets.
- N'oubliez pas que balayer des objets depuis l'espace du tas créera des trous dans la mémoire provoquant une fuite de mémoire. Pour éviter un tel scénario, Garbage Collector implémente le compactage de l'espace mémoire
Exemples de Garbage Collector en Java
Exemple de system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Production:
Objet
Explication du code ci-dessus
- Dans le code ci-dessus, les deux objets obj1 et obj2 pointent vers null et sont donc stockés dans l'espace Eden avec des valeurs nulles et non référencées
- System gc () invoquera un thread démon de garbage collection et les deux objets seront supprimés de l'espace.
Avantages et inconvénients
Voici quelques avantages et inconvénients de Java Garbage Collector:
Avantages de gc:
- Le garbage collection augmente l'efficacité de la mémoire car il supprimera tous les objets inutilisés et nuls
- Un garbage collector est un processus automatique, donc le développeur peut ne pas s'en occuper, car dans d'autres langues sans programmeur de garbage collector il faut s'occuper d'un problème de mémoire insaisissable.
Inconvénients de gc:
- Le garbage collector exécutera la fonction gc principale qui parcourra tout l'espace du tas, ce qui accélérera lentement votre programme de quelques secondes.
- Ce processus prendra plus de temps CPU rendant le système de code plus lent.
- Si vous travaillez sur une application nécessitant une mémoire énorme, utilisez les drapeaux JVM disponibles.
- Si l'espace de mémoire est plein et que les objets ne peuvent pas être glissés ou ajoutés davantage, Java rejette l'erreur de mémoire, ce qui ralentira l'application entière et peut également provoquer des fuites de mémoire.
Articles recommandés
Ceci est un guide sur Qu'est-ce que Java Garbage Collector?. Ici, nous discutons de son fonctionnement avec les fonctions, exemple, avantages et inconvénients de Java garbage collector. Vous pouvez également consulter les articles suivants pour en savoir plus–
- Constructeur et destructeur en Java
- Destructeur en Java
- Performances C # vs Java
- Qu'est-ce que la JVM?