Réaliser un Heap Dump d’un process Java sous Linux
Qu’est qu’un Heap Dump d’un process Java
Il peut arriver qu’une webapp Tomcat parte en “live” pour d’étranges raisons. Dans ce cas, il convient de faire un heap dump de la mémoire du process Java.
Voici le script que j’utilise pour avoir le maximum d’info lorsque le process part dans les tours et qui redémarre Tomcat.
#!/bin/bash DATE=`date +"%y%m%d_%Hh%M"` PID=`pidof java` HOSTNAME=`hostname | cut -d "." -f 1 | tr "[:lower:]" "[:upper:]"` DUMP_FILE="/data/HeapDump_${HOSTNAME}_${DATE}.hprof" kill -3 ${PID} /usr/java/latest/bin/jmap -F -dump:format=b,file=${DUMP_FILE} ${PID} service tomcat stop mv /var/log/tomcat/catalina.out /var/log/tomcat/catalina_${DATE} service tomcat start gzip ${DUMP_FILE}
Le ‘kill -3‘ permet de “dumper” les threads et les stacks en cours sur la sortie standard. Dans notre cas, c’est le fichier catalina.out qui la reçoit.
Une Stack énorme ou avec de nombreux “Lock” peut nous aiguiller sur le problème.
La commande ‘jmap‘ permet de récupérer un fichier contenant la totalité des objets présents en mémoire. Rapatriez ce fichier, dé-gézipé le et ouvrez le avec Eclipse Memory Analyser.
Ce dernier propose différents analyseurs pour vous aider à mettre le doigt sur votre problème.