JavaRush /Blog Java /Random-FR /Pause café #210. Tous les types de garbage collector en J...

Pause café #210. Tous les types de garbage collector en Java que vous devriez connaître

Publié dans le groupe Random-FR
Source : Hackernoon À travers cet article, vous découvrirez les forces et les faiblesses de chaque type de garbage collector utilisé dans le développement Java. Pause café #210.  Tous les types de garbage collector en Java que vous devriez connaître - 1La question sur le Garbage Collector (GC) peut être entendue dans presque toutes les interviews. J'ai donc décidé de collecter toutes les informations nécessaires à leur sujet en utilisant mon principe préféré : court et simple. Tout d’abord, commençons par le but de CG et pourquoi nous avons besoin de plusieurs types de garbage collector. Dans des langages comme C, nous devons stocker les informations sur les objets en mémoire et écrire beaucoup de code passe-partout pour libérer cette mémoire. Bien entendu, les fuites de mémoire sont courantes dans de tels programmes. Java résout le problème des fuites de mémoire à l'aide d'un garbage collector. Et vous, en tant que développeur, devez savoir quel ramasse-miettes est préférable d'utiliser. Beaucoup dépend de l'endroit et de la manière dont votre programme s'exécute. Il peut fonctionner sur un matériel faible ou avec un grand nombre d'objets, ou votre programme doit être très rapide. Sur la base de ces conditions, vous devez régler votre garbage collector pour obtenir les performances souhaitées. Alors, commençons.

Comment la JVM gère la mémoire

La machine virtuelle Java (JVM) divise la mémoire en deux zones : le tas, qui stocke les données d'application, et le non-tas, qui stocke le code du programme et d'autres données. Tournons notre attention vers la zone du tas. C'est là que notre programme crée de nouveaux objets. Tous les garbage collectors sont basés sur le fait que de nombreux programmes utilisent des objets éphémères. Autrement dit, ces objets ont été créés, puis ont rempli leur fonction et ne sont plus nécessaires. La majorité de ces objets. Mais certains objets durent beaucoup plus longtemps, peut-être même pendant toute la durée du programme. C'est là que surgit l'idée de diviser les objets en jeunes et vieilles générations. Et nous devons très souvent surveiller la jeune génération. Le fait est que les processus de collecte des ordures sont divisés en nettoyages mineurs, qui affectent uniquement la jeune génération, et en nettoyage complet, qui peuvent affecter les deux générations. N'oubliez pas que le garbage collector est un programme. Et cela nécessite du temps et des ressources de votre ordinateur pour fonctionner. Ce qui affecte également notre application. Comment cela affecte-t-il ? Par exemple, pour effectuer le garbage collection, la JVM met notre application en pause. C’est ce qu’on appelle une pause Stop-The-World (STW). Pendant ce temps, tous les threads d’application sont suspendus. Mais l’application à l’intérieur l’ignore complètement. Pour l’application, le temps s’écoule uniformément. Pourquoi est-ce si grave? Imaginez, vous écrivez une sorte d'application d'échange ou une application pour un pilote automatique d'avion. Votre application pourrait se mettre en veille pendant une seconde et la nature de votre problème pourrait changer radicalement. Autrement dit, la pause est un paramètre important pour chaque ramasse-miettes. La prochaine propriété fondamentale du garbage collector est le temps total passé à collecter les garbage par rapport au temps total d'exécution du programme. Qu’est-ce que cela signifie et pourquoi est-ce si important ? Au lieu d’une grande phase « Stop-The-World », nous pouvons choisir un algorithme avec de nombreuses petites pauses. Les petites pauses sont préférables, mais rien n’est gratuit. Dans ce cas, nous payons en augmentant le temps total d'exécution du programme. Et nous devons également en tenir compte. Le paramètre suivant est la quantité de ressources matérielles. Chaque collecteur a besoin de mémoire pour stocker les informations sur les objets et d'un processeur pour effectuer le nettoyage. Le dernier paramètre est la vitesse. L'efficacité du garbage collection fait référence à la rapidité et à l'efficacité avec lesquelles le garbage collector (GC) récupère la mémoire qui n'est plus utilisée par un programme. Tous ces paramètres influencent l'algorithme, qui peut libérer de la mémoire le plus rapidement possible tout en consommant un minimum de ressources. Jetons un coup d'œil aux éboueurs dont nous disposons. Pour l’entretien, vous devez connaître les cinq premiers. Les deux autres sont beaucoup plus difficiles.

CPG série

Serial GC est le garbage collector de la machine virtuelle Java et est utilisé depuis le début de Java. Il est utile pour les programmes avec un petit tas et fonctionnant sur des machines moins puissantes. Ce garbage collector divise le tas en régions, qui incluent Eden et Survivor. La région Eden est le pool à partir duquel la mémoire pour la plupart des objets est initialement allouée. Survivor est un pool contenant des objets qui ont survécu à la collecte des ordures dans la région d'Eden. Au fur et à mesure que le tas se remplit, les objets sont déplacés entre les régions Eden et Survivor. La JVM surveille en permanence le mouvement des objets dans les régions Survivant et sélectionne un seuil approprié pour le nombre de ces mouvements, après quoi les objets sont déplacés vers la région Tenured. Lorsqu'il n'y a pas assez d'espace dans la région Tenured, un ramassage complet des déchets prend le relais, travaillant sur les objets des deux générations. Le principal avantage de ce garbage collector réside dans sa faible consommation de ressources, un processeur basse consommation suffit donc pour effectuer la collecte. Le principal inconvénient de Serial GC réside dans les longues pauses lors du garbage collection, en particulier lorsqu'il s'agit de grandes quantités de données.

CG parallèle

Un garbage collector parallèle (Parallel CG) est similaire à un constructeur séquentiel. Il inclut le traitement parallèle de certaines tâches et la possibilité d'ajuster automatiquement les paramètres de performances. Parallel GC est un garbage collector pour machine virtuelle Java basé sur les idées de Serial GC, mais avec un parallélisme et une intelligence supplémentaires. Si l'ordinateur dispose de plusieurs cœurs de processeur, l'ancienne version de la JVM sélectionne automatiquement Parallel GC. Le tas ici est divisé dans les mêmes régions que dans Serial GC - Eden, Survivor 0, Survivor 1 et Old Gen (Tenured). Cependant, plusieurs threads participent au garbage collection en parallèle et le collecteur peut s'adapter aux paramètres de performances requis. Chaque thread collecteur possède une zone mémoire qui doit être effacée. Parallel GC dispose également de paramètres visant à atteindre l’efficacité requise du garbage collection. Le collecteur utilise les statistiques des garbage collection précédentes pour ajuster les paramètres de performances des futures collectes. Parallel GC permet un réglage automatique des paramètres de performances et des temps de pause de construction réduits, mais il présente un inconvénient mineur sous la forme d'une certaine fragmentation de la mémoire. Il convient à la plupart des applications, mais pour les programmes plus complexes, il est préférable de choisir des implémentations de garbage collector plus avancées. Avantages : Plus rapide que Serial GC dans de nombreux cas. A une bonne vitesse. Inconvénients : consomme plus de ressources et les pauses peuvent être assez longues, mais nous pouvons ajuster la durée maximale de pause de Stop-The-World.

Balayage de marques simultané

Le garbage collector Concurrent Mark Sweep (CMS) vise à réduire la durée maximale de pause en exécutant certaines tâches de garbage collection simultanément avec les threads d'application. Ce garbage collector est adapté à la gestion de grandes quantités de données en mémoire. Concurrent Mark Sweep (CMS) est une alternative au Parallel GC dans la machine virtuelle Java (JVM). Il est destiné aux applications qui nécessitent un accès à plusieurs cœurs de processeur et sont sensibles aux pauses Stop-The-World. Le CMS effectue des étapes de garbage collection en parallèle avec le programme principal, ce qui lui permet de s'exécuter sans s'arrêter. Il utilise la même organisation mémoire que les collecteurs Serial et Parallel, mais n'attend pas que la zone Tenured soit remplie pour lancer la purge ancienne génération. Au lieu de cela, il s'exécute en arrière-plan et tente de maintenir la région Tenured compacte. Concurrent Mark Sweep commence par une phase de marquage initiale qui arrête brièvement les threads principaux de l'application et marque tous les objets accessibles depuis la racine. Les threads principaux de l'application reprennent alors et le CMS commence à rechercher tous les objets actifs accessibles par des liens à partir des objets racine marqués. Après avoir marqué tous les objets vivants, le collectionneur efface la mémoire des objets morts dans plusieurs threads parallèles. L’un des avantages d’un CMS est qu’il se concentre sur la réduction des temps d’arrêt, ce qui est essentiel pour de nombreuses applications. Cependant, cela nécessite des sacrifices en termes de ressources CPU et de bande passante globale. De plus, le CMS ne compresse pas les objets de l’ancienne génération, ce qui entraîne une fragmentation. De longues pauses dues à d'éventuelles pannes du mode parallèle peuvent être une surprise désagréable (même si elles ne se produisent pas souvent). S'il y a suffisamment de mémoire, le CMS peut éviter de telles pauses. Avantages : Rapide. A de petites pauses Stop-The-World. Inconvénients : consomme plus de mémoire ; si la mémoire est insuffisante, certaines pauses peuvent être longues. Pas très bien si l'application crée beaucoup d'objets.

Les déchets d’abord

Garbage-First (G1) est considéré comme une alternative à un CMS, notamment pour les applications serveur fonctionnant sur des serveurs multiprocesseurs et gérant de grands ensembles de données. Le garbage collector G1 convertit la mémoire en plusieurs régions de taille égale, à l'exception des régions immenses (qui sont créées en fusionnant des régions régulières pour accueillir des objets massifs). Les régions ne doivent pas nécessairement être organisées en rangée et peuvent modifier leur appartenance générationnelle. De petites purges sont effectuées périodiquement pour la jeune génération et déplacent les objets vers les régions survivantes ou les mettent à niveau vers la génération plus âgée et les transfèrent vers les titulaires. Le nettoyage est effectué uniquement dans les régions où il faut éviter de dépasser la durée souhaitée. Le collecteur lui-même prédit et sélectionne les régions contenant la plus grande quantité de déchets à nettoyer. Les balayages complets utilisent une boucle de marquage pour créer une liste d'objets actifs qui s'exécute en parallèle avec l'application principale. Après le cycle de marquage, G1 passe à l'exécution de purges mixtes, qui ajoutent des régions de génération plus ancienne à l'ensemble de régions de génération plus jeune à purger. Le garbage collector G1 est considéré comme plus précis que le collecteur CMS pour prédire la taille des pauses et répartit mieux le garbage collection dans le temps pour éviter de longs temps d'arrêt des applications, en particulier avec des tas de grande taille. Il ne fragmente pas non plus la mémoire comme le collecteur CMS. Cependant, le collecteur G1 nécessite davantage de ressources CPU pour fonctionner en parallèle avec le programme principal, ce qui réduit le débit des applications. Avantages : Fonctionne mieux que le CMS. A des pauses plus courtes. Inconvénients : consomme plus de ressources CPU. En outre, il consomme plus de mémoire si nous avons de nombreux objets assez volumineux (plus de 500 Ko), car il place ces objets dans une seule région (1 à 32 Mo).

EpsilonGC

Epsilon GC est conçu pour les situations où la collecte des déchets n'est pas nécessaire. Il n'effectue pas de garbage collection, mais utilise TLAB (thread-local allocation buffers) pour allouer de nouveaux objets - de petits tampons mémoire demandés par les threads individuels du tas. Les objets énormes qui ne rentrent pas dans le tampon demandent des blocs de mémoire spécifiquement pour eux-mêmes. Lorsque le GC Epsilon manque de ressources, une OutOfMemoryError est générée et le processus se termine. Les avantages d'Epsilon GC incluent des besoins en ressources réduits et une allocation de mémoire plus rapide pour les applications qui créent tous les objets dont elles ont besoin au démarrage ou exécutent des applications de courte durée qui n'utilisent pas toute la mémoire allouée. Epsilon GC peut également vous aider à analyser les besoins en ressources que d'autres garbage collector ajoutent à votre application. Avantages : Très rapide. Inconvénients : N'efface pas les objets :) Les deux collecteurs suivants sont les plus avancés de leur genre, mais aussi les plus complexes. Nous les examinerons donc brièvement.

ZGC

ZGC peut maintenir une latence inférieure à la milliseconde même lorsqu'il traite d'énormes quantités de données. ZGC est un garbage collector développé par Oracle pour Java, conçu pour fournir un débit élevé et une faible latence lors du traitement de gros tas (jusqu'à 16 To). ZGC est basé sur les principes de la mémoire virtuelle et utilise différentes marques de couleur pour suivre l'état des objets pendant le garbage collection. Avantages : les pauses sont inférieures à une milliseconde, même sur des tas volumineux, ce qui est très utile pour les applications nécessitant des temps de traitement de requêtes courts. Il fonctionne avec de très gros tas avec un bon débit. ZGC peut compresser la mémoire tas pendant le garbage collection. Inconvénients : utilisation élevée du processeur et exigences de performances importantes, ce qui peut ralentir les temps de lancement des applications.

Shenandoah G.C.

Shenandoah GC est un autre ramasse-miettes avec de courtes pauses quelle que soit la taille du tas. Ce garbage collector est développé par Red Hat. Il est conçu pour minimiser le temps qu'une application consacre à la récupération de place. Comme ZGC, il s'agit d'un collecteur parallèle, ce qui signifie qu'il s'exécute pendant que l'application est en cours d'exécution, minimisant ainsi les pauses. Shenandoah GC utilise des « pointeurs de transfert » pour déplacer des objets pendant le garbage collection. Il dispose également d’une technique appelée « suppression des barrières de charge » pour améliorer les performances. Avantages : Shenandoah GC peut atteindre des temps de pause courts, souvent inférieurs à 10 ms, même pour des tas volumineux. Bon débit. Inconvénients : charge élevée du processeur et difficulté à travailler sous de lourdes charges.

Conclusion

Les éboueurs sont l’une des tâches les plus difficiles de la programmation. De nouveaux développements sont constamment réalisés dans cette direction. Bien qu'il soit rare que les programmeurs modifient le GC, vous devez néanmoins avoir au moins une connaissance approfondie du fonctionnement de votre outil de récupération de place.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION