259 votes

Comment obtenir un vidage des threads et du tas d'un processus Java sous Windows qui n'est pas exécuté dans une console ?

J'ai une application Java que je lance à partir d'une console qui, à son tour, exécute un autre processus Java. Je veux obtenir un vidage de thread/heap de ce processus enfant.

Sous Unix, je pouvais faire un kill -3 <pid> mais sous Windows, la seule façon d'obtenir un vidage de fil est de faire Ctrl-Break dans la console. Mais cela ne me donne que le vidage du processus parent, pas du processus enfant.

Y a-t-il un autre moyen d'obtenir ce vidage de tas ?

433voto

rkaganda Points 281

Vous pouvez utiliser jmap pour obtenir un dump de n'importe quel processus en cours, en supposant que vous connaissez le pid .

Utilisez le Gestionnaire des tâches ou Resource Monitor pour obtenir le pid . Ensuite,

jmap -dump:format=b,file=heap.hprof <pid>

pour obtenir le tas pour ce processus.

Pour les systèmes où bash y pgrep sont installés et qu'un seul processus Java est en cours d'exécution, essayez :

jmap -dump:format=b,file=heap.hprof $(pgrep java)

126voto

Derek Points 112

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/

34voto

Roberto Flores Points 51

Je pense que la meilleure façon de créer un fichier .hprof dans un processus Linux est avec jmap commande. Par exemple : jmap -dump:format=b,file=filename.hprof {PID}

22voto

ankon Points 1576

En plus d'utiliser le jconsole/visualvm mentionné, vous pouvez utiliser jstack -l <vm-id> sur une autre fenêtre de ligne de commande, et capturez cette sortie.

Le <vm-id> peut être trouvé en utilisant le gestionnaire de tâches (c'est l'identifiant du processus sur Windows et unix), ou en utilisant jps .

Les deux sites jstack y jps sont inclus dans le Sun JDK version 6 et plus.

19voto

Lawrence Dol Points 27976

Je recommande le Java VisualVM distribué avec le JDK (jvisualvm.exe). Il peut se connecter dynamiquement et accéder aux threads et au tas. Je l'ai trouvé inestimable pour certains problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X