what is garbage collection java
Ce didacticiel explique ce qu'est Garbage Collection en Java et comment fonctionne Garbage Collector. Vous découvrirez également les algorithmes pour le nettoyage de la mémoire:
Les lecteurs connaissant le C / C ++ doivent être conscients qu'il est de la responsabilité du programmeur de créer et de supprimer les objets en C / C ++.
Des erreurs graves surviennent si le programmeur oublie de détruire les objets créés. En effet, le fait de ne pas détruire les objets peut entraîner ' Mémoire insuffisante ”Erreurs, fuites de mémoire, etc.
Cette situation est complètement prise en charge en Java car il n'est pas nécessaire qu'un programmeur garde une trace des objets. Java s'occupe de la destruction des objets pour nous grâce au ramasse-miettes automatique.
=> Visitez ici pour apprendre Java à partir de zéro.
Le processus par lequel les objets qui ne sont plus utilisés sont supprimés de la mémoire du tas s'appelle «Garbage Collection». La technique de garbage collection fait partie de la gestion de la mémoire en Java.
Ainsi en Java, le Garbage Collector détruit tous les objets qui ne sont plus utilisés.
Ce que vous apprendrez:
- Qu'est-ce qu'un garbage collector en Java?
- Comment fonctionne le nettoyage de la mémoire en Java?
- Algorithmes de récupération de place en Java
- Conclusion
Qu'est-ce qu'un garbage collector en Java?
Garbage Collection en Java est géré par un programme appelé Garbage Collector.
Garbage Collector peut être défini comme un programme utilisé pour gérer automatiquement la mémoire en gérant la désallocation d'objet.
On sait qu'en langage Java, les nouveaux objets sont créés et alloués en mémoire à l'aide du nouvel opérateur. La mémoire allouée à un objet à l'aide d'un nouvel opérateur reste allouée jusqu'à ce que les références utilisent cet objet.
Dès que les références cessent d'exister, la mémoire qu'occupe l'objet est récupérée. Java gère alors la désallocation ou la destruction d'objets automatiquement et nous n'avons pas besoin de détruire explicitement l'objet.
Cette technique est la technique de nettoyage de la mémoire en Java où les programmeurs n'ont pas besoin de gérer explicitement la désallocation des objets.
Notez que si les programmes ne désallouent pas la mémoire alors que les objets n'en ont pas besoin, il n'y aura finalement plus de mémoire à allouer et les programmes tomberont en panne. Cette situation s'appelle une fuite de mémoire.
Le garbage collector s'exécute toujours en arrière-plan sur un thread démon. Garbage Collector est considéré comme le meilleur exemple du thread démon.
Garbage Collector s'exécute dans l'intention de libérer la mémoire du tas. Il fait cela en détruisant les objets qui sont «inaccessibles».
Qu'est-ce qu'un objet «inaccessible»?
Un objet devient inaccessible lorsqu'il n'y a même pas une seule référence qui lui est associée.
Considérez le morceau de code suivant:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Comme le montre le code ci-dessus, un objet est accessible tant qu'une référence lui est associée. Au moment où l'association de référence est supprimée (une référence à null dans le cas ci-dessus), l'objet devient inaccessible.
Lorsqu'un objet devient inaccessible, il devient éligible pour Garbage Collection (GC).
Comment rendre un objet éligible au GC?
Bien que le programmeur ne soit pas obligé de détruire les objets car ils sont pris en charge par GC, au moins le programmeur peut rendre ces objets inaccessibles lorsqu'ils ne sont plus nécessaires.
En faisant cela, GC collectera les objets inaccessibles et les détruira.
Il existe plusieurs façons de rendre un objet éligible pour GC en le rendant inaccessible.
Elles sont:
# 1) Annulez la référence
Étant donné une référence affectée à un objet, si cet objet n'est plus nécessaire, affectez la référence à null.
Student s = new Student (); s = null;
Lorsque s est défini sur null, l'objet Student devient inaccessible.
# 2) Réaffecter la référence
C'est une autre façon de rendre les objets éligibles au GC.
Considérez le code suivant.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Maintenant que nous avons assigné s1 à un autre objet, l'objet Student référencé par s1 est déréférencé.
# 3) Créer un objet anonyme
En créant un objet anonyme, nous pouvons rendre les objets éligibles pour GC.
Nous pouvons créer un objet anonyme comme indiqué ci-dessous:
new Student();
Une fois que nous rendons les objets éligibles à GC, ces objets peuvent ou non être détruits immédiatement par GC. C'est parce que nous ne pouvons pas forcer explicitement le GC à s'exécuter comme et quand nous le voulons.
Quand le garbage collector s'exécute-t-il?
Il appartient à la JVM d'exécuter le programme Garbage Collector. Lorsque JVM exécute le garbage collector, les objets inaccessibles sont détruits. Mais encore, nous ne pouvons pas garantir quand la JVM fonctionnera.
Bien que nous ne puissions pas forcer l'exécution du GC, nous pouvons très bien demander un Garbage Collection.
Le GC peut être demandé en utilisant l'une des méthodes suivantes.
# 1) System.gc (): La classe System de Java fournit une méthode statique gc () à l'aide de laquelle nous pouvons demander à la JVM d'exécuter Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Comme System.gc (), nous pouvons également utiliser la méthode gc () de «Runtime class» pour demander à JVM d'exécuter Garbage Collector.
Noter: Il n'y a aucune garantie que le garbage collector s'exécutera après une demande de ces deux méthodes.
Finalisation
La finalisation est effectuée par Garbage Collector juste avant de détruire les objets. Dans le cadre de la technique de finalisation, le garbage collector appelle la méthode finalize () sur l'objet. La méthode finalize () est utilisée pour effectuer des activités de nettoyage.
La méthode finalize () est fournie par la classe «Object» et possède le prototype suivant.
protected void finalize () throws Throwable
La méthode finalize () est invoquée chaque fois que l'objet est récupéré
Noter: Le garbage collector collecte uniquement les objets créés à l'aide du mot clé new. Pour les autres objets, nous devons utiliser la méthode finalize () pour effectuer le nettoyage.
Le programme ci-dessous montre un garbage collection simple en Java.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Production
Dans le programme ci-dessus, nous avons créé une classe TestGC. Dans cette classe, nous avons remplacé la méthode finalize (). Ensuite, dans la classe principale, nous créons deux objets de la classe TestGC. Tout d'abord, nous annulons un objet et appelons System.gc () pour demander Garbage Collector.
Ensuite, nous annulons le deuxième objet et appelons la méthode Runtime.getRuntime.gc () pour demander Garbage Collector. La sortie montre la sortie de la méthode finalize deux fois, indiquant ainsi que le garbage collector s'est exécuté deux fois.
Noter: Bien que nous ayons cette sortie, il n'est pas garanti que nous obtiendrons à chaque fois la même sortie. Cela dépend complètement de JVM.
Comment fonctionne le nettoyage de la mémoire en Java?
Dans cette section, nous verrons comment fonctionne Garbage Collection en Java.
Pendant le garbage collection, le garbage collector recherche la mémoire du tas, puis «marque» les objets inaccessibles. Ensuite, il les détruit.
Mais le problème se pose lorsque le nombre d'objets augmente. À mesure que les objets augmentent, le temps nécessaire au nettoyage de la mémoire augmente également car il recherche des objets inaccessibles. Cependant, cela n’affecte pas trop car la plupart des objets ont une courte durée de vie.
Le comportement ci-dessus s'appelle «Collecte de la mémoire générationnelle» et est censé améliorer les performances de la JVM. Dans cette approche, tout l'espace du tas est divisé en: jeune génération, génération ancienne ou titulaire et génération permanente.
# 1) Espace tas de jeune génération: Tous les nouveaux objets sont créés dans cet espace. Une fois que l'espace est plein, un GC mineur a lieu dans lequel tous les objets morts sont détruits. Le processus GC mineur est rapide et rapide car la plupart des objets sont morts. Les objets survivant à la jeune génération sont déplacés vers les générations plus âgées.
# 2) Espace de tas d'ancienne génération: Cette génération stocke des objets qui survivent longtemps. Lorsque l'âge seuil fixé pour la jeune génération est atteint, l'objet est déplacé vers l'ancienne génération. Lorsque l'espace de l'ancienne génération est rempli, un GC majeur est effectué.
Le GC majeur est lent car les objets impliqués ici sont des objets vivants. Parfois, tout l'espace du tas qui comprend les générations jeunes et anciennes est effacé. Cela s'appelle «Full GC».
# 3) Génération permanenteL Jusqu'à Java 7, il y avait une génération permanente (Perm Gen). Les métadonnées détenues par Perm Gen ont été utilisées par JVM. JVM a utilisé ces métadonnées pour décrire les classes et les méthodes utilisées dans l'application. Le Perm Gen a été supprimé dans Java 8.
Récupération de la mémoire Java 8: Perm Gen et Metaspace
Nous avons déjà mentionné l'espace Perm Gen qui était présent jusqu'à Java 7. Cependant, maintenant dans Java 8, la JVM représente les métadonnées de classe en utilisant la mémoire native appelée «Metaspace».
Outre Metaspace, il existe un nouvel indicateur appelé «MaxMetaspaceSize» qui limite la mémoire utilisée pour les métadonnées de classe. Si aucune valeur n'est spécifiée pour MaxMetaspaceSize, le Metaspace le redimensionne au moment de l'exécution en fonction de la demande de l'application.
Lorsque l'espace de métadonnées de classe atteint MaxMetaspaceSize, le GC Metaspace est déclenché. Lorsqu'il y a trop de Metaspace GC, cela indique une fuite de mémoire des classes, des chargeurs de classe, etc. ainsi qu'un dimensionnement inadéquat.
Algorithmes de récupération de place en Java
Le nettoyage de la mémoire est effectué de différentes manières. Dans cette section, nous présenterons quatre méthodes ou algorithmes pour Garbage Collection en Java.
GC série
Serial GC est l'algorithme GC le plus simple. Il fonctionne principalement sur les petites tailles de tas et les systèmes à un seul thread. Pendant le travail, Serial GC gèle toutes les applications.
Pour activer Serial GC, nous pouvons utiliser l'option JVM suivante.
comment ouvrir un fichier .xml
java –xx:+UseSerialGC –jar Application.java
La commande ci-dessus peut être donnée dans la ligne de commande. Ici, Application.java est un fichier pour lequel le GC série doit être activé.
Débit / GC parallèle
L'algorithme Parallel GC est celui par défaut dans JDK 8. Cet algorithme utilise plusieurs threads pour analyser l'espace du tas et le compactage. Cet algorithme convient principalement aux applications capables de gérer les pauses de thread et d'optimiser la surcharge du processeur.
Un inconvénient du GC parallèle est que lors de l'exécution d'un GC mineur ou complet, l'algorithme met en pause les threads d'application.
Le collecteur CMS
Le CMS signifie « Balayage de marque simultané ». Cet algorithme utilise plusieurs concurrent threads pour analyser le tas ( marque ) pour identifier les objets inutilisés et recycler ( balayer ) leur. Le collecteur CMS a un mode Stop-The-World (STW).
Le collecteur passe dans ce mode dans deux scénarios:
- Lorsque des objets appartenant à l'ancienne génération peuvent être atteints à partir de variables statiques ou de points d'entrée de thread. Donc, ce mode est activé lors de l'initialisation des marques de racine initiales.
- Lorsque l'algorithme s'exécute simultanément, l'application modifie l'état et force le collecteur à revenir en arrière pour s'assurer que les objets corrects sont marqués.
Le collecteur CMS peut cependant souffrir de «pannes de promotion». Alors qu'est-ce qu'un échec promotionnel? Si les objets de l'espace de la jeune génération sont déplacés vers l'ancienne génération et que le collectionneur n'a pas fait assez d'espace pour ces objets dans l'espace de tas de l'ancienne génération, un échec promotionnel se produira.
Pour éviter l'échec de la promotion, nous pouvons fournir plus de threads d'arrière-plan au collecteur ou fournir plus de taille de tas à l'ancienne génération.
Le collectionneur G1
Le collecteur G1 est le collecteur «Garbage-First». Il est conçu pour des tailles de tas de plus de 4 Go. En fonction de la taille du tas, il divise la taille du tas en régions de tailles allant de 1 Mo à 32 Mo.
Le collecteur G1 marque les objets en fonction de la vivacité des objets tout au long du tas. Après cette phase de marquage, G1 a connaissance des régions vides. Ainsi, il collecte les objets inaccessibles de ces régions, libérant ainsi une grande quantité d'espace. Par conséquent, il est nommé Garbage-First car il collecte d'abord les régions contenant des déchets.
Il répond également à l'objectif de temps de pause défini par l'utilisateur en utilisant un modèle de prédiction de pause en sélectionnant le nombre de régions à collecter en fonction de l'objectif de temps de pause spécifié.
Avantage de la collecte des ordures
- Le nettoyage de la mémoire rend la gestion de la mémoire en Java efficace car il supprime les objets non référencés de la mémoire du tas sans l'intervention du programmeur.
- Comme le nettoyage de la mémoire est automatique et fait partie de JVM, aucun effort supplémentaire n'est nécessaire de la part du programmeur pour récupérer de la mémoire ou détruire des objets.
- Le programmeur n'a pas besoin d'écrire de code spécifique pour désallouer la mémoire et supprimer des objets comme cela a été fait en C / C ++.
Questions fréquemment posées
Q # 1) Quel est le rôle d'un garbage collector?
Répondre: En Java, le garbage collector est la partie principale dans la gestion de la mémoire et est chargé de collecter les objets inaccessibles et de récupérer la mémoire.
Q # 2) Qu'entendez-vous par Garbage Collection?
Répondre: Le garbage collection est la technique par laquelle la mémoire est gérée automatiquement en récupérant la mémoire inutilisée. C'est une fonctionnalité présente dans les langages de programmation comme Java, grâce à laquelle les programmeurs n'ont pas besoin de suivre les objets inutilisés et de les détruire. Cela se fait automatiquement à l'aide de Garbage Collection.
Q # 3) Qui est responsable du nettoyage de la mémoire en Java?
Répondre: La gestion de la mémoire de Java est sous la responsabilité de Garbage Collection.
Q # 4) Comment pouvons-nous empêcher le nettoyage de la mémoire en Java?
Répondre: Comme le garbage collector ne récupère pas la mémoire des variables / objets vivants, la meilleure façon d'empêcher le garbage collection est de continuer à utiliser des variables / objets dans tout le programme.
Q # 5) Comment pouvez-vous vous assurer qu'un objet est récupéré de la mémoire?
Répondre: Un objet est éligible pour le nettoyage de la mémoire lorsqu'il est inaccessible, c'est-à-dire lorsque plus aucune référence ne fait référence à l'objet. Bien que nous ne puissions pas forcer le Garbage Collector à s'exécuter quand nous le voulons, nous pouvons toujours lui demander de s'exécuter en utilisant System.gc ().
Conclusion
Le nettoyage de la mémoire en Java dont nous avons parlé dans ce tutoriel est automatique et le programmeur n'a pas besoin de se soucier de la suppression des objets ou des variables alloués dans le programme.
Le nettoyage automatique de la mémoire en Java est la fonctionnalité la plus importante du langage et fait partie de la gestion de la mémoire en Java.
Bien que Garbage Collection soit effectué par JVM et soit hors de portée du programmeur, nous pouvons toujours demander au Garbage Collector de s'exécuter à l'aide de la méthode gc () de la classe System et Runtime.
Dans ce didacticiel, nous avons abordé le processus de finalisation effectué avant que les objets ne soient détruits par Garbage Collector. Nous avons également discuté du processus du Garbage Collection en Java. Enfin, nous avons discuté des différents algorithmes utilisés par le Garbage Collector.
Ceci termine notre discussion sur Garbage Collector en Java.
=> Regardez la série de formation Java simple ici.
lecture recommandée
- Principes de base de Java: syntaxe Java, classe Java et principaux concepts Java
- À quoi sert Java: 12 applications Java du monde réel
- Tutoriel Java String | Méthodes de chaîne Java avec exemples
- Tutoriel JAVA pour les débutants: plus de 100 tutoriels vidéo Java pratiques
- Composants Java: plateforme Java, JDK, JRE et machine virtuelle Java
- Déploiement Java: création et exécution d'un fichier JAR Java
- Machine virtuelle Java: comment JVM aide à exécuter une application Java
- Tutoriel de réflexion Java avec des exemples