web-dev-qa-db-fra.com

kill -3 pour obtenir Java)

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!!

110
javanerd

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
186
Joshua McKinnon

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.

40
Kris Babic

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
29
Vadzim

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.

21
Arnab Biswas

Au même endroit que la sortie standard de la JVM. Si vous avez un serveur Tomcat, ce sera le fichier catalina_(date).out.

10
Daniel

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:

  • Kill -3: Donne la sortie à la sortie standard.
  • Si vous avez accès à la fenêtre de la console où le serveur est en cours d'exécution, vous pouvez utiliser la combinaison de touches Ctrl + Break pour générer la trace de pile sur la sortie std.
  • Pour le hotspot VM, nous pouvons également utiliser la commande jstack pour générer le vidage de thread. C'est une partie du JDK. La syntaxe est la suivante: Utilisation: jstack [-l] (pour se connecter au processus en cours d'exécution) jstack -F [-m] [-l] (pour se connecter à un processus bloqué)
  • Pour JRockit JVM, nous pouvons utiliser la commande JRCMD fournie avec la syntaxe JDK: jrcmd [[]] [-l] [-f fichier] [-p] -h]
8
Apoorve
  1. Trouver l'identifiant du processus [PS ID]
  2. Exécuter jcmd [ps ID] Thread.print
2
Mehmet Erdemsoy

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.

2
anish

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
1
Nick