J'utilise la kill -3
commande pour voir le vidage des threads de la JVM sous Unix. Mais où puis-je trouver la sortie de cette kill
commande? Je suis perdu!!
J'utilise la kill -3
commande pour voir le vidage des threads de la JVM sous Unix. Mais où puis-je trouver la sortie de cette kill
commande? Je suis perdu!!
Réponses:
Vous pouvez également utiliser jstack (inclus avec JDK) pour effectuer un vidage de thread et écrire la sortie où vous le souhaitez. 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 fichier kill -3
. Si vous redirigez la sortie de console de la JVM vers un fichier, le vidage de threads 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 vers un fichier séparé avec l'option de diagnostic LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Avec Java 8 en image, jcmd
c'est l'approche préférée.
jcmd <PID> Thread.print
Voici l'extrait de la documentation Oracle :
La sortie de JDK 8 a introduit Java Mission Control, Java Flight Recorder et l'utilitaire jcmd 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 réduction des performances.
Cependant, l'expédition de ceci avec l'application peut avoir des implications de licence dont je ne suis pas sûr.
jcmd
ne parvient pas à se connecter au processus de service Windows avec com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
while jstack -F
réussit: stackoverflow.com/questions/1197912/…
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à lorsque vous utilisez kill -3. Il existe plusieurs façons d'obtenir des threads:
kill -3 <PID>
: Donne la sortie à la sortie standard.Pour les machines virtuelles hotspot, nous pouvons également utiliser la jstack
commande pour générer un vidage de thread. Cela fait partie du JDK. La syntaxe est la suivante:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
devrait pas tuer la JVM. Quel type d'application Java recherchez-vous?
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.
Étapes à suivre si vous souhaitez effectuer le vidage des 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 le 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. soit 8536
linux$ jstack **8536** > threadDump.log