Plein de paramètres java intéressants pour limiter les resources utilisées par une JVM dans un container.
Always set the -Xmx
parameter when you run a JVM inside a container:
- if not specified, the JVM will try to use up to 1/4 of the total memory of the container host
- if you only specify container memory limits, docker will kill the JVM process if it tries to grow above the container limits
A partir de Java8, la Metaspace qui remplace la PermGen n'est plus dans la Heap Java mais dans la mémoire native de l'OS.
Par défaut le HeapDump ne fournit donc plus d'infos sur la Metaspace.
Solution:
jmap -clstats PID to dump class loader statistics;
jcmd PID GC.class_stats to print the detailed information about memory usage of each loaded class. The latter requires -XX:+UnlockDiagnosticVMOptions.
Pour analyser le contenu d'un thread dump
Pour générer un thread dump:
jstack -l <JVM_PID>
Ce guide explique le fonctionnement interne de la JVM et des différents Garbage Collectors et donne des piste de troubleshooting et de profiling avec VisualVM et autres outils d'analyse de dump.
Avec Java8, la PermGen est remplacée par la Metaspace.
Alors que l'espace occupé par la PermGen faisait partie de la Heap (memoire allouée à la JVM avec les parametres -Xms et -Xmx), la Metaspace fait partie de l'espace mémoire du process (en dehors de la Heap).
Avant de mettre en production, il faut limiter la taille max de la Metaspace avec -XX:MetaspaceSize.
Lors d'une migration depuis Java7, il peut être nécessaire de réduire la Heap comme la Metaspace sera en dehors de la Heap
Paramètres JVM pour loguer l'activité du Garbage Collector dans un fichier:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
-
Pour activer les Heap Dump en cas de OOM:
dans catalina.sh:JAVA_OPTS='-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dir'
-
code servlet java qui créé un OOM pour tester la création du Heap Dump:
ArrayList<String> a = new ArrayList<String>(); while(true) { a.add("asdfasdjf;lasdkjfl;SJF;LAJFDL;ASJDFL;ASJDFL;AJSDFL;JSLFJSDL;FJS;LFJA;LSDKJ;ksdjflsjdf;lasjdlfkj"); }
Une liste des options de la JVM utiles en production
Ça permet d'aller un peu plus loin que le traditionnel -Xms/-Xmx pour dimensionner la Heap.