Vous confondez deux java dumps différents. kill -3
génère un vidage de fil, pas un vidage de tas.
Thread dump = traces de la pile pour chaque thread de la JVM en sortie sur stdout comme texte.
Heap dump = contenu de la mémoire pour le processus JVM sorti dans un fichier binaire.
Pour faire un vidage de fil sous Windows, CTRL + BREAK si votre JVM est le processus de premier plan est le moyen le plus simple. Si vous avez un shell de type Unix sous Windows comme Cygwin ou MobaXterm, vous pouvez utiliser kill -3 {pid}
comme vous pouvez le faire dans Unix.
Pour faire un "thread dump" sous Unix, CTRL + C si votre JVM est le processus de premier plan ou kill -3 {pid}
fonctionnera tant que vous obtiendrez le bon PID pour la JVM.
Quelle que soit la plate-forme, Java est livré avec plusieurs utilitaires qui peuvent vous aider. Pour les threads dumps, jstack {pid}
est votre meilleure chance. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
Juste pour finir la question de la décharge : Les vidages de tas ne sont pas couramment utilisés car ils sont difficiles à interpréter. Mais, ils contiennent beaucoup d'informations utiles si vous savez où et comment les regarder. L'utilisation la plus courante est de localiser les fuites de mémoire. C'est une bonne pratique de définir l'option -D
sur la ligne de commande java afin que le vidage du tas soit généré automatiquement en cas d'erreur OutOfMemoryError, -XX:+HeapDumpOnOutOfMemoryError
Mais vous pouvez aussi déclencher manuellement un vidage de tas. Le moyen le plus courant est d'utiliser l'utilitaire java jmap
.
NOTE : cet utilitaire n'est pas disponible sur toutes les plateformes. A partir de JDK 1.6, jmap
est disponible sur Windows.
Un exemple de ligne de commande ressemblerait à ceci
jmap -dump:file=myheap.bin {pid of the JVM}
La sortie "myheap.bin" n'est pas lisible par l'homme (pour la plupart d'entre nous), et vous aurez besoin d'un outil pour l'analyser. Ma préférence va à MAT. http://www.eclipse.org/mat/