Sévérité : ÉlevéeTuning JVM

Tomcat qui ralentit puis plante (OutOfMemoryError)

```text
java.lang.OutOfMemoryError: Java heap space
[GC (Allocation Failure) ... Full GC (Ergonomics) ... 1998M->1995M(2048M), 4.2 secs]
```

Détecter

Temps de réponse qui se dégradent sur plusieurs heures, CPU à 100 %, puis arrêt de l'application. Le problème revient quelques jours après chaque redémarrage.

Symptômes

Temps de réponse qui se dégradent sur plusieurs heures, CPU à 100 %, puis arrêt de l'application. Le problème revient quelques jours après chaque redémarrage.

Environnement

Tomcat 10 sur JVM 17, -Xmx2g, application métier avec cache applicatif.

Cause racine

Fuite mémoire : un cache sans limite de taille conserve des objets indéfiniment. Le ramasse-miettes enchaîne les Full GC (CPU à 100 %, pauses) sans récupérer de mémoire, jusqu'à l'OOM.

Diagnostic

  1. Journaux GC : fréquence des Full GC et mémoire récupérée.
  2. jstat -gcutil <pid> 5s : ancienne génération qui reste proche de 100 %.
  3. Heap dump et analyse (Eclipse MAT) : dominator tree → objet qui retient la mémoire.

Solution

Court terme : redémarrage planifié et augmentation temporaire du heap. Durable : borner le cache (taille maximale + expiration), corriger le code, recetter sous charge.

Commandes

jcmd <pid> GC.heap_info
jstat -gcutil <pid> 5s 10
jcmd <pid> GC.heap_dump /tmp/heap.hprof

Options JVM recommandées :

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/dumps -Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime

Prévention

Supervision des métriques JVM (heap après GC, temps de GC), tests d'endurance, revue de code des caches, limites mémoire cohérentes avec le conteneur.