Le Garbage collector permet de nettoyer une partie de la mémoire de l’application, au niveau de la heap.

Mémoire Heap

La heap est divisée en deux zones : Young generation : la zone jeune est l’endroit où les objets nouvellement créés sont stockés. Encore divisée en deux “Eden Space” et “survivor spaces”. Les objets qui sont conservés dans la young generation sont promus dans la old generation. Old generation : la zone de stockage long, où les objets ont survécu à plusieurs cycles de collection dans la young generation. La zone est aussi subdivisée en deux espaces, l’espace permanent “permanent space” et l’espace de la pile “stack memory”.

Types de collector

  • Serial GC, GC par défaut pour les applications à faible consommation de mémoire, mono-thread. La collecte est relativement simple. -XX:+UseSerialGC
  • Parallel GC, pour les applications à forte consommation de mémoire, multi-threads. La collecte s’exécute en parallèle sur plusieurs threads pour améliorer les performances. -XX:+UseParallelGC
  • Concurrent-Mark sweep GC, pour les applications avec des temps de réponse rapides, où la latence est un facteur critique. La collecte fonctionne en arrière-plan pour minimiser la durée de la pause de collection. -XX:+UseConcMarkSweepGC
  • Garbage-First GC (G1), pour les applications à forte consommation de mémoire et contraintes de temps de réponse strictes. Fonctionne en parallèle sur plusieurs threads pour les performances et utilise aussi un tri de tas pour optimiser les performances. -XX:+UseG1GC

Fonctionnement du Garbage collector

Le GC s’exécute en arrière-plan, à la recherche des objets plus référencés par le programme et les marque pour la suppression. Le traitement de nettoyage est déclenché lorsque la JVM détecte que l’espace disponible sur le tas est devenu insuffisant pour allouer de nouveaux objets.

Dans la zone jeune, la stratégie de GC se base sur le comptage de référence dans l’application. Une fois qu’un objet n’est plus référencé, le GC le marque comme objet à supprimer. Une fois qu’un objet a survécu à plusieurs cycles, l’objet est promu à la zone ancienne.

Dans la zone ancienne, le GC utilise une stratégie de marque et de balayage. Cette stratégie marque tous les objets encore référencés, puis balaie la mémoire pour supprimer les objets non marqués. Cette stratégie peut engendrer une pause dans la JVM ce qui peut affecter les performances.

Les performances du GC dépendent de beaucoup de facteurs comme la taille de l’application, le nombre d’allocations, le nombre de threads.

Des tests de performances sont à effectuer pour attribuer la meilleure stratégie de GC.


Source: