Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Comment puis-je générer un thread dump Java sur Linux/Unix?

Solution Verified - Updated -

Environment

  • Java
  • Linux et la plupart des environnements de type Unix

Issue

  • Comment puis-je générer un thread dump dans JBoss sous Linux?
  • Comment puis-je générer une stack trace JBoss sous Linux?
  • Comment puis-je rediriger la sortie de kill -3 vers un fichier?

Resolution

Voici quelque méthodes pour générer thread dump Java sous Unix:

  • Notez le numéro d'identification du processus Java (par exemple en utilisant top et grep sur un ps-axw, etc) et envoyer un signal QUIT au processus avec la commande kill -QUIT ou kill -3. Par exemple (Screencast tutorial):
kill -3 JAVA_PID
  • Exécutez le fichier joint threaddump_linux.sh ou threaddump-solaris.sh pour capturer une série de 6 thread dump espacé de 20 secondes d'intervalle (vous pouvez modifier si nécessaire), en passant l'ID du processus Java en tant qu'argument. Par exemple:
Linux: sh ./threaddump_linux.sh JAVA_PID
Solaris: bash ./threaddump_solaris.sh JAVA_PID

Assurez-vous de tester le script avant que problème n'arrive pour s'assurer qu'il fonctionne correctement dans votre environnement.

Linux: sh ./threaddump_linux-continuous.sh JAVA_PID
Solaris: bash ./threaddump_solaris-continuous.sh JAVA_PID

Assurez-vous de tester le script avant que problème n'arrive pour s'assurer qu'il fonctionne correctement dans votre environnement.

  • Si l'application Java est lancée avec un script de service qui enregistre la sortie de la console, les thread dump seront dans le journal de la console. Sinon, simplement rediriger stdout dans un fichier au démarrage.
  • Utilisez la commande ci-dessous pour démarrer votre instance de JBoss, puis utilisez kill -3 pour générer les thread dumps.
nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

        Ceci permet de rediriger la sortie/thread dump dans le fichier console spécifiée dans la commande ci-dessus.

OpenJDK / Sun JDK
  • Utilisez jps -lv pour trouver l'ID du processus Java pour l'émission du kill -QUIT ou kill -3.
  • Assurez-vous que l'option JVM -Xrs n'est pas utilisé, car il provoque les signaux SIGQUIT et SIGWAITING a être ignorés. L'exécution de kill -3 envoie un signal SIGQUIT à la JVM, donc l'utilisation de cette option entraînera kill -3 d'être ignoré. Voir http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/java.html.
  • Si vous utilisez OpenJDK ou Sun JDK 1.6 ou plus , l'utilisation de jstack est une option. Ceci est utile lorsque la redirection de la sortie vers un fichier est problématique pour une raison quelconque (par exemple, on ne veut pas redémarrer la JVM juste pour rediriger la sortie ). Exécutez ce qui suit, en passant l'ID de processus Java:
jstack -l JAVA_PID &gt; jstack.out
  • Vous pouvez également exécuter le fichier threaddump_linux_jstack-continuous.sh pour capturer en continu 6 thread dumps avec un intervalle de 20 secondes et les recueillir dans un fichier appelé "jstack_threaddump.out" d'ou le script sera exécuté, en passant l'ID du processus Java en tant qu'argument. Assurez-vous que vous définissez la variable "JAVA_HOME" dans ce script. Par exemple:
 ./threaddump_linux_jstack-continuous.sh JAVA_PID

Note: Il ya des bugs connus liés à l'utilisation des autres options jstack (par exemple -F, m, etc) et/ou les outils de thread dumps ne ​​sont pas en mesure d'analyser la sortie, si d'autres options que -l sont utilisé, assurez-vous de tester la capture et l'analyse de la sortie.

JBoss EAP 5
  • Pour rediriger stdout vers un fichier au démarrage:
sh run.sh &gt; out.log 2&gt;&amp;1
  • Si vous avez de la difficulté à rediriger stdout, modifier la variable $JBOSS_HOME/bin/run.sh et changer la ligne:
org.jboss.Main "$@"

pour:

org.jboss.Main "$@" &gt; console.log

Enregistrer et redémarrer JBoss normalement. Maintenant kill -3 ou kill -QUIT devrait créer un thread dump dans le fichier console.log.

JBoss EAP 6

La recommandation est d'utiliser jstack.


Si vous voulez prendre des thread dumps pour identifier quels threads Java consomment beaucoup de cpu, s'il vous plaît consulter How do I identify high CPU utilization by Java threads on Linux/Solaris et utiliser l'exemple de script joint dans l'article.

Attachments

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments