kill -3 pour obtenir java thread dump
J'utilise la commande kill -3
pour voir le vidage de threads de la JVM sous unix. Mais où puis-je trouver la sortie de cette commande kill
? Je suis perdu!!
9 answers
Vous pouvez également utiliser jstack (inclus avec JDK) pour prendre un vidage de thread et écrire la sortie où vous voulez. N'est-ce pas disponible dans un environnement unix?
jstack PID > outfile
Le vidage de thread est écrit sur le système à partir de la machine virtuelle sur laquelle vous avez exécuté le kill -3. Si vous redirigez la sortie de console de la JVM vers un fichier, le vidage de thread sera dans ce fichier. Si la JVM s'exécute dans une console ouverte, le vidage des threads sera affiché dans sa console.
Il existe un moyen de rediriger la sortie de vidage de thread JVM sur le signal de rupture pour séparer le fichier avec Option de diagnostic LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Avec Java 8 dans l'image, jcmd
est l'approche préférée.
jcmd <PID> Thread.print
Voici l'extrait de Documentation Oracle :
La sortie de JDK 8 a introduit Java Mission Control, Java Flight Recorder et jcmd utility pour diagnostiquer les problèmes avec les applications JVM et Java. Il est suggéré d'utiliser le dernier utilitaire, jcmd au lieu de l'utilitaire jstack précédent pour des diagnostics améliorés et une surcharge de performances réduite.
Cependant, l'expédition de ce avec la demande peut être des implications de licence dont je ne suis pas sûr.
Au même endroit où la sortie standard de la JVM est placée. Si vous avez un serveur Tomcat, ce sera le fichier catalina_(date).out
.
Lors de l'utilisation de kill -3, il faut voir le vidage des threads dans la sortie standard. La plupart des serveurs d'applications écrivent la sortie standard dans un fichier séparé. Vous devriez le trouver là lorsque vous utilisez kill -3. Il existe plusieurs façons d'obtenir des vidages de threads:
- Tuer -3 : Donne la sortie standard.
- Si l'on a accès à la fenêtre de la console où le serveur est en cours d'exécution, on peut utiliser la combinaison de touches Ctrl+Break pour générer la trace de la pile sur la sortie std.
- Pour hotspot VM nous pouvons également utiliser la commande jstack pour générer un vidage de threads. C'est une partie du JDK. La syntaxe est comme suit: Utilisation: jstack [- l ]( pour se connecter au processus en cours) jstack -F [-m] [-l] (pour se connecter à un processus bloqué)
- Pour JRockit JVM, nous pouvons utiliser la commande JRCMD qui vient avec la syntaxe JDK: jrcmd [ []] [-l] [-f file] [- p] - h]
Dans Jboss, vous pouvez effectuer les opérations suivantes
nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
kill -3 <java_pid>
Cela redirigera votre sortie/threadump vers la console de fichiers spécifiée dans la commande ci-dessus.
- Trouver l'id de processus [PS ID]
- Exécuter le thread jcmd [PS ID].imprimer
Étapes à suivre si vous voulez le vidage de threads de votre processus Java autonome
Étape 1: Obtenez l'ID de processus pour le script shell appelant le programme java
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
Étape 2: Obtenez l'ID de processus pour l'enfant qui a été appelé par runABCD. Utilisez le PID ci-dessus pour obtenir les enfants.
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
Étape 3: Obtenez le JSTACK pour le processus particulier. Obtenez l'id de processus de votre processus XYSServer. c'est à dire 8536
linux$ jstack **8536** > threadDump.log