J'utilise kill -3
commande pour voir le dump de threads de la machine virtuelle Java sous unix. Mais où puis-je trouver le résultat de cette commande kill
? Je suis perdu!!
Vous pouvez également utiliser jstack (inclus avec JDK) pour effectuer un vidage de thread et écrire la sortie où vous le souhaitez. Est-ce que ce n'est pas disponible dans un environnement unix?
jstack PID > outfile
Le vidage de thread est écrit sur le système depuis le VM) sur lequel vous avez exécuté kill -3. Si vous redirigez la sortie de la console de la JVM vers un fichier, le vidage de thread sera inséré. Si la machine virtuelle Java s'exécute dans une console ouverte, le vidage de thread sera affiché dans sa console.
Il existe un moyen de rediriger la sortie du vidage du thread JVM sur le signal de rupture en fichier séparé 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 version de JDK 8 introduisait Java Mission Control, Java Flight Recorder et l’utilitaire jcmd permettant de diagnostiquer les problèmes liés à la JVM et Java = applications. Il est suggéré d'utiliser l'utilitaire le plus récent, jcmd, au lieu de l'utilitaire précédent jstack pour améliorer les diagnostics et réduire les coûts liés aux performances.
Toutefois, l'envoi de cette information avec l'application peut entraîner des problèmes de licence, ce dont je ne suis pas sûr.
Au même endroit que la sortie standard de la JVM. Si vous avez un serveur Tomcat, ce sera le fichier catalina_(date).out
.
Lorsque vous utilisez kill -3, vous devriez voir le vidage de thread dans la sortie standard. La plupart des serveurs d'applications écrivent la sortie standard dans un fichier séparé. Vous devriez le trouver là en utilisant kill -3. Il y a plusieurs façons d'obtenir des vidages de threads:
Dans Jboss, vous pouvez effectuer les tâches 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.
Les étapes que vous devez suivre si vous voulez le vidage de thread de votre processus autonome Java processus
Étape 1: Obtenir l’ID de processus du 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: Obtenir 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'identifiant de processus de votre processus XYSServer. c'est-à-dire 8536
linux$ jstack **8536** > threadDump.log