Méthodo/Agilité

Configuration du Garbage Collector en Java : comment bien le paramétrer ?

18 janvier 2022

Le Garbage Collector (GC) ou ramasse-miettes en français est un mécanisme automatique destiné à libérer de la mémoire en Java. Cette fonctionnalité incluse dans la JVM (Java Virtual Machine) permet aux développeurs d’être plus productifs. Ils ne gèrent plus manuellement la libération de la mémoire. Cependant, pour une utilisation optimale de ce processus, il est important de bien en comprendre les rouages. Si le Garbage Collector est mal paramétré, il peut créer des dysfonctionnements en bloquant notamment tous les threads d’une application. Pour éviter ces problèmes et booster les performances de vos programmes, voici tout ce qu’il faut savoir sur la configuration du Garbage Collector en Java.

 

Garbage Collector : définition et fonctionnement

 

Le Garbage Collector en Java s’occupe de l’allocation et de la désallocation automatique de la mémoire. Plus concrètement, ce ramasse-miettes recherche les objets inutilisés ou inaccessibles et les supprime afin de libérer de la mémoire pour les autres.

Pour cela, le GC emploie deux méthodes :

 

Ces processus demandent beaucoup de ressources. L’exécution du GC est d’ailleurs parfois appelée phase de « Stop the World » car elle peut nécessiter de mettre en pause l’ensemble des threads de l’application le temps du nettoyage. Il est donc indispensable de bien comprendre le fonctionnement en background du ramasse-miettes pour limiter ces arrêts.

 

Mode de fonctionnement du Garbage collector : différentes zones de stockages

Pour fonctionner, une application Java crée des objets qui ont chacun une adresse en mémoire et une valeur. Dès qu’une application se lance, le système alloue à la JVM un espace mémoire : la Heap ou tas. Ce tas est organisé en plusieurs zones, dans lesquelles les objets sont transférés :

Le Garbage Collector intervient à plusieurs niveaux de cette Heap. Lors d’un premier processus appelé « minor GC », il supprime les objets inutiles ou inaccessibles pour vider l’espace Eden. Les objets restants sont déplacés dans la Old Generation.

Si l’espace mémoire de cette Old Generation se remplit, l’application n’aura plus assez de mémoire pour créer de nouveaux objets. Le GC intervient alors dans un processus « major GC » pour libérer de l’espace dans la Old Generation. Enfin, si l’application n’a toujours pas suffisamment de mémoire, un « full GC » peut être activé pour nettoyer l’intégralité de la Heap.

Les temps nécessaires au « major GC » et au « full GC » sont longs et interrompent l’exécution de l’application. Le full Garbage Collection est d’ailleurs une des principales causes de la baisse de performance dans les applications Java. C’est pourquoi bien configurer le ramasse-miettes est essentiel.

 

Configuration du Garbage Collector en Java : les options de paramétrage

Pour que les applications Java s’exécutent de façon optimale, il faut implémenter la configuration du GC correspondant à leurs besoins. Ensuite, pour obtenir de bonnes performances, vous pouvez configurer les options supplémentaires d’allocations de la mémoire.

Les différents types d’implémentations du Garbage Collector en Java

La JVM comprend 4 grands types d’implémentations pour le GC :

Le serial collector est l’implémentation la plus simple du GC. Il fonctionne sur un seul thread et gèle tous les autres lors de son exécution. Il est utile uniquement pour les applications simples, à thread unique car il risque d’entraîner des ralentissements et dysfonctionnements dans les applications multi-threads.

Pour activer le Serial Garbage Collector, utilisez :

java -XX:+UseSerialGC -jar Application.java

Le Parallel GC est l’implémentation par défaut du ramasse-miettes dans la JVM. Il utilise plusieurs threads pour nettoyer le tas mais bloque aussi les autres processus de l’application lors de son exécution. Il est donc nécessaire de spécifier le nombre maximal de threads autorisés pour la collecte d’objets, la taille du tas et le temps de pause.

Pour activer le Parallel Garbage Collector, utilisez :

java -XX:+UseParallelGC -jar Application.java

Pour définir le temps de pause maximal, tapez :

-XX:MaxGCPauseMillis = temps de pause

Pour spécifier le nombre de threads que doit utiliser le ramasse-miettes, utilisez :

-XX:ParallelGCThreads= nombre de threads

Enfin, pour définir la taille du Heap, tapez :

-Xmx<taille>

 

Le ramasse-miettes G1 est un GC de type serveur, destiné aux machines multiprocesseurs disposant de grandes mémoires. Il permet de réduire les temps de pause tout en conservant une disponibilité et une réactivité élevées de l’application grâce à un système de partitionnement de la Heap.

Pour l’activer, utilisez :

-XX:+UseG1GCq

 

Le ZGC a pour objectif de réduire les temps de pause. Pour cela, il utilise notamment une technique de coloration du pointeur. Ce processus permet de stocker des informations dans des pointeurs eux-mêmes, notamment des données indiquant si l’objet a déjà été marqué ou déplacé.

Pour activer le ZGC, utilisez :

java -XX:+UseZGC Application.java

 

Les options supplémentaires d’allocation de la mémoire

Quelle que soit l’implémentation du GC choisie, vous pouvez également configurer la JVM pour améliorer ses performances. Le premier réglage concerne la taille du tas. Celle-ci dépend majoritairement du volume de données traitées par votre application. Plus celui-ci est important, plus la taille de la Heap doit être élevée.

Paramétrez ensuite les options suivantes :

 

D’autres options de paramétrages permettent de définir les tailles respectives des espaces de la Heap :

 

Optimiser les performances du Garbage Collector

Chaque application a ses spécificités et la configuration du GC doit répondre à ses besoins. Pour optimiser au mieux les performances, vous pouvez surveiller ces indicateurs :

 

 

Plusieurs méthodes permettent de connaître les valeurs de ces paramètres. Les temps de pause peuvent être vérifiés en inspectant les sorties de diagnostics de la JVM. La ligne de commande :  -verbose:gc  permet d’afficher les informations sur la Heap et le ramasse-miettes à chaque collecte.

 

Le réglage du ramasse-miettes n’est donc pas une tâche évidente. Elle demande des connaissances et une bonne compréhension des besoins en mémoire de son application.  Cependant, grâce aux différents paramètres et options présentés dans cet article, vous avez toutes les clés en mains pour optimiser la configuration de votre Garbage Collector.

 

Les 6 points clés à retenir :

 

Retrouvez nos autres derniers articles sur le blog :

 

Sources

Java HotSpot VM Options (oracle.com)

Ajouter un commentaire


Votre commentaire sera modifié par le site si besoin.

À lire également

Le Garbage Collector (GC) ou ramasse-miettes en français est un mécanisme automatique destiné à libérer de la…
Méthodo/Agilité

Les principes de base du clean code en…

10 novembre 2021

Focus sur le clean code en environnement Java Le code ne doit pas seulement être compris par…
Le multiprocessing et le multithreading visent tous deux à améliorer les performances d’un système. Découvrez leurs différences…