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
- Journaux GC : fréquence des Full GC et mémoire récupérée.
jstat -gcutil <pid> 5s: ancienne génération qui reste proche de 100 %.- 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.