Java Garbage Collection – un aperçu
Garbage Collection est un processus permettant d'identifier et de supprimer les objets de la mémoire Heap qui ne sont pas utilisés. Le GC libère l'espace après avoir supprimé les objets non référencés.
L'événement dans lequel les récupérateurs de mémoire effectuent leur travail s'appelle "Arrêtez le monde" ce qui signifie que tous vos threads d'application sont mis en attente.
Fonctionnement de Garbage Collector
Une machine virtuelle Java (JVM) est une implémentation logicielle d'une machine physique. Il existe différentes implémentations de JVM. Ici, nous parlerons de la JVM Oracle HotSpot. Le processus de base de Hotspot JVM Garbage collector se termine en deux phases:
Phase 1. Marquage
Cette phase est appelée phase de marquage dans laquelle GC identifie les objets qui sont utilisés ou qui ne le sont pas.
Phase 2. Suppression
Dans la phase de suppression, l'objet marqué est supprimé et la mémoire est libérée. La suppression des objets non référencés peut être effectuée de deux façons:
- Suppression normale: Dans cette phase, tous les objets inutilisés seront supprimés et l'allocateur de mémoire contient des pointeurs vers l'espace libre où un nouvel objet peut être alloué. Suppression et compactage: Comme vous le voyez dans la suppression normale, il existe des blocs libres entre les objets référencés. Pour améliorer encore les performances, outre la suppression d'objets non référencés, l'objet référencé restant sera compact .
Pourquoi le tas est-il divisé en générations
Il est fastidieux de scanner tous les objets d'un tas et de les marquer et de les compacter. La liste de l'objet se développe progressivement, ce qui augmente le temps de collecte des ordures puisque de plus en plus d'objets sont alloués avec le temps.
Dans les applications générales, la plupart des objets sont de courte durée. De moins en moins d'objets restent alloués au fil du temps.
C'est pourquoi, pour améliorer les performances de la JVM, Heap est décomposé en petites parties appelées générations et JVM exécute GC dans ces générations lorsque la mémoire est sur le point de se remplir.
Processus générationnel de collecte des ordures
Maintenant, quand vous savez pourquoi le tas est divisé en générations, il est temps de regarder comment ces générations interagissent.
- De nouveaux objets sont alloués dans l'espace Eden de ] Jeune génération . Les deux espaces Survivor sont vides au démarrage
- Une collection d'ordures mineures se déclenchera une fois que l'espace Eden se remplira
- Les objets référencés sont déplacés vers l'espace survivant S0 et Eden Space être effacé et tous les objets non référencés seront supprimés.
- Il se passera de nouveau dans l'espace Eden quand la prochaine fois le GC sera déclenché. Cependant, dans ce cas, tous les objets référencés sont déplacés vers l'espace survivant S1. De plus, les objets du dernier GC mineur sur l'espace des survivants S0 ont leur âge incrémenté et sont déplacés vers S1. Maintenant Eden et S0 seront effacés, et ce processus se répètera à chaque fois que le GC sera déclenché. À chaque CG déclenchée, les espaces survivants seront changés et l'âge de l'objet sera incrémenté
- Une fois que les objets atteignent un certain seuil d'âge, ils sont promus de jeune génération à ancienne génération. Donc, cela décrit à peu près comment la promotion des objets a lieu
- Le GC majeur sera déclenché une fois que l'ancienne génération sera complètement remplie.
Collecteurs de place disponibles dans Hotspot JVM
- Collecteur de place série: Serial GC conçu pour les environnements à un seul thread. Il utilise juste un seul thread pour collecter les ordures. C'est best adapté aux programmes en ligne de commande simples. Bien qu'il puisse être utilisé sur des multiprocesseurs pour des applications avec de petits ensembles de données.
- Parallel Garbage Collector: Contrairement à Serial GC, il utilise plusieurs threads pour la récupération de place. Il s'agit d'un collecteur par défaut de JVM et il est également appelé le récupérateur de place .
- Collecteur de place de CMS: CMS utilise plusieurs threads en même temps pour analyser la mémoire de tas et marquer dans l'expulsion disponible puis balayez les instances marquées.
- G1 Garbage Collector: G1 Garbage collector est également appelé Garbage First. Il est disponible depuis Java 7 et son objectif à long terme est de remplacer le collecteur CMS. Le collecteur G1 est un garbage collector parallélisé, concomitant et à compactage incrémentiel
Points à retenir pour optimiser les performances des générations:
- Basé sur certaines configurations de matériel et de système d'exploitation l'un de ces Garbage Collector est sélectionné par défaut. Le but de divers éboueurs est disponible est de choisir approprié selon le besoin de votre application.
- Pour activer explicitement le GC particulier, nous pouvons utiliser given ( -XX: + UseSerialGC – XX: + UseSerialGC – XX: + UseParallelGC -XX: + UseG1GC ) Options de VM
- Principalement, deux composants de JVM sont concentrés sur, lors de l'optimisation des performances Heap et le Garbage Collector.
- Young Generation est le premier endroit pour optimiser la performance, pour définir la taille de YG que nous pouvons utiliser -XX : NewSize et -XX : MaxNewSize Options VM.
- -Xmx / 2 ( -Xmx pour définir la taille maximale du tas) est une limite supérieure pour -XX: MaxNewSize . C'est pour une raison de stabilité. Il n'est pas permis de choisir une taille de jeune génération plus grande que l'ancienne génération.
- Il est également possible de spécifier la taille de la jeune génération par rapport à la taille de l'ancienne génération en utilisant -XX: NewRation . Par exemple, si nous définissons -XX: NewRatio = 3 cela signifie que l'ancienne génération sera 3 fois plus grande que YG.
Source link