Aller au contenu principal

Garbage Collection (GC) dans la JVM – Optimisation et Configuration

Objectif

Réduire les pauses du GC (garbage collection) dans les applications Java en choisissant un collecteur adapté (G1, ZGC, Shenandoah), et en configurant la JVM pour maintenir un bon équilibre entre latence, débit et consommation mémoire.


Qu'est-ce que le Garbage Collection ?

Le Garbage Collector est un mécanisme de la JVM qui :

  • Identifie les objets inutilisés (non référencés)
  • Libère la mémoire occupée
  • Peut provoquer des pauses si mal configuré (impact direct sur la latence)

Pourquoi c'est critique pour la performance ?

Dans les systèmes :

  • temps réel (jeux, finances)
  • haute charge (web, microservices)
  • à faible latence (Kafka, base de données, batch)

Un GC mal configuré peut :

  • Créer des pauses "stop-the-world" (jusqu’à plusieurs secondes)
  • Provoquer des pics CPU
  • Dégrader la réactivité utilisateur

Types de Collecteurs de Garbage Collection

CollecteurDepuisAvantagesInconvénientsQuand l’utiliser
Serial GCJava 1.2SimplePauses longuesPetites applications
Parallel GCJava 1.4Bon débitPauses longuesBatch/serveurs
G1 GCJava 9 (par défaut)Pauses prévisibles, bon compromisPas idéal pour très faible latenceApplications web, APIs
ZGCJava 11+Pauses < 10 ms, scalableMoins de tuning disponibleTrès faible latence
ShenandoahJava 12+ (Red Hat)Similaire à ZGCMoins portableFaible latence avec HotSpot

Comment choisir le bon GC

BesoinCollecteur recommandé
Stabilité et facilité de configurationG1 GC
Ultra faible latence (<10 ms)ZGC ou Shenandoah
Débit maximal (batch processing)Parallel GC

Configuration JVM recommandée

G1 GC (bon compromis entre latence et débit)

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-XX:+ParallelRefProcEnabled
-Xms2g -Xmx4g
  • MaxGCPauseMillis : cible de durée maximale de pause
  • InitiatingHeapOccupancyPercent : seuil de déclenchement du GC

ZGC (ultra faible latence)

-XX:+UseZGC
-Xmx4g -Xms4g
  • Idéal pour les systèmes sensibles à la latence (finance, streaming)
  • Requiert Java 11+

Outils de monitoring recommandés

OutilUtilisation
JVisualVM / JConsoleVisualisation des pauses GC et des générations
Logs GC (-Xlog:gc*)Analyse détaillée des cycles de GC
Java Flight Recorder (JFR)Profilage détaillé de la JVM
Prometheus + GrafanaMonitoring en temps réel des métriques JVM

Mauvaises pratiques à éviter

Mauvaise pratiqueConséquence
Ignorer les logs GCComportement du GC non observable
Utiliser un GC inadapté au contexteLongues pauses, performances imprévisibles
Mauvais dimensionnement du heapTrop petit → GC fréquent, trop grand → temps de scan
Trop d’allocations éphémèresSurcharge des GC mineurs
Utilisation de finalize()Ralentit le GC, méthode obsolète

Exemple métier

Cas : Application de génération de PDF en ligne

  • Problème : Pic d’objets temporaires (~100 MB par génération)
  • Effet : GC fréquent, pauses visibles côté utilisateur
  • Solution :
    • Passage à G1 GC
    • -XX:MaxGCPauseMillis=150
    • Réduction des allocations temporaires (réutilisation de buffers)
    • Mise en place de Prometheus + Grafana pour suivi JVM

Pour aller plus loin


Résumé

  • Le Garbage Collector est essentiel à la stabilité de la JVM
  • Le choix du GC dépend de ton objectif (latence ou débit)
  • G1 GC est un bon choix par défaut
  • ZGC ou Shenandoah conviennent aux systèmes à latence très faible
  • Toujours monitorer les cycles de GC en production