Comment puis-je générer des thread dumps d’une JVM sous UNIX ou Windows ?

Un thread dump est une liste de tous les threads Java actuellement actifs dans une machine virtuelle Java (JVM).

Il existe plusieurs façons de générer des thread dumps d’une JVM. Il est vivement recommandé de générer plusieurs thread dumps. Il est généralement conseillé de générer dix thread dumps à intervalles réguliers (par exemple, un thread dump toutes les dix secondes).
 

Étape 1 : Obtenez le PID du processus Java

Pour générer un thread dump, vous devez tout d’abord connaître le PID du processus Java.

Le JDK Java intègre la commande jps qui répertorie tous les ID de processus Java. Vous pouvez exécuter cette commande comme suit :

jps -l 70660 sun.tools.jps.Jps 70305

Remarque : Sous Linux et UNIX, vous devrez peut-être exécuter cette commande comme suit : sudo -u user jps -l, où « user » correspond au nom d’utilisateur sous l’identité duquel s’exécute le processus Java.

Si cela ne fonctionne pas ou si le processus Java reste introuvable (chemin d’accès non défini, JDK non installé ou ancienne version Java), utilisez

  • UNIX, Linux et Mac OS X : ps -el | grep java
  • Windows : appuyez sur Ctrl + Maj + Échap pour ouvrir le gestionnaire des tâches et rechercher le PID du processus Java.

Étape 2 : Demandez un thread dump de la JVM

jstack

S’il est installé/disponible, nous vous recommandons d’utiliser l’outil jstack. Il imprime les thread dumps sur la console de ligne de commande.

Pour obtenir une thread dump à l’aide de jstack, exécutez la commande suivante :
jstack -l <pid>

Vous pouvez générer des thread dumps consécutifs dans un fichier à l’aide de la directive de redirection/annexion de la sortie de console :
jstack -l <pid> >> threaddumps.log

Remarques :

  • L’outil jstack est disponible depuis la version 1.5 du JDK (pour la JVM sous Windows, il est uniquement disponible dans certaines versions de JDK 1.5 et JDK 1.6).
  • L’outil jstack fonctionne même si le paramètre jvm -Xrs est activé.
  • Il est impossible d’utiliser l’outil jstack du JDK 1.6 pour générer des thread dumps d’un processus s’exécutant sous le JDK 1.5.
  • Sous Linux et UNIX, vous devez exécuter la commande en tant qu’utilisateur possédant le processus Java :
    sudo -u <utilisateur-java> jstack -l <pid>  
    (<utilisateur-java> doit être remplacé par l’identifiant de l’utilisateur sous l’identité duquel s’exécute le processus Java)
  • Sous Windows, si vous exécutez l’outil jstack et obtenez l’erreur « Espace de stockage insuffisant pour traiter cette commande », vous devez exécuter l’outil jstack en tant qu’utilisateur système de Windows ou en tant qu’utilisateur qui possède le processus Java.  Pour ce faire, utilisez l’outil psexec que vous pouvez télécharger ici. Pour exécuter l’outil jstack en tant qu’utilisateur système, utilisez une commande similaire à celle-ci :
    psexec -s jstack <pid>  >> threaddumps.log
    Si vous ne pouvez pas installer psexec sur le serveur, vous pouvez créer un fichier .bat contenant la commande et l’exécuter à l’aide du planificateur de tâches Windows (en tant qu’un autre utilisateur).
  •  Parfois, il est requis d’ajouter l’option -J-d64 sur les systèmes 64 bits, par exemple :
     jstack -J-d64 -l <pid> >> threaddumps.log

Script jstack

Voici un script, obtenu auprès de eclipse.org, qui génère une série de thread dumps à l’aide de l’outil jstack.  Il inclut également l’utilisation du processeur au niveau du thread à l’aide de la commande top.

#!/bin/bash
if [ $# -eq 0 ]; then
    echo >&2 "Usage: jstackSeries <pid> <run_user> [ <count> [ <delay> ] ]"
    echo >&2 "    Defaults: count = 10, delay = 0.5 (seconds)"
    exit 1
fi
pid=$1          # required
user=$2         # required
count=${3:-10}  # defaults to 10 times
delay=${4:-0.5} # defaults to 0.5 seconds
while [ $count -gt 0 ]
do
    sudo -u $user top -H -b -n1 -p $pid >top.$pid.$(date +%H%M%S.%N) &
    sudo -u $user jstack -l $pid >jstack.$pid.$(date +%H%M%S.%N)
    sleep $delay
    let count--
    echo -n "."
done

 

Exécutez-le comme suit :
sh jstackSeries.sh [pid] [cq5serveruser] [count] [delay]

Par exemple :
sh jstackSeries.sh 1234 cq5serveruser 10 3

  • 1234 est le PID du processus Java.
  • cq5serveruser est l’utilisateur Linux ou UNIX sous l’identité duquel s’exécute le processus Java.
  • 10 correspond au nombre de thread dumps à générer.
  • 3 correspond au délai entre chaque dump.

Remarque : La sortie top comporte l’ID du thread natif au format décimal alors que le NID de la sortie jstack est au format hexadécimal.  Vous pouvez faire correspondre le thread de processeur élevé de la sortie top avec la sortie jstack en convertissant l’ID du thread en valeur hexadécimale.

Outil Image mémoire des threads (Thread Dump) pour Adobe Experience Manager

Si vous utilisez le produit Adobe Experience Manager, vous pouvez installer cet outil pour disposer d’une interface utilisateur simple pour générer des thread dumps.

Autres méthodes pour générer un thread dump

Si l’outil jstack n’est pas disponible, vous pouvez générer des thread dumps comme suit :

Remarque : Certains outils ne peuvent pas générer de thread dumps d’une JVM si le paramètre de ligne de commande -Xrs est activé. Si vous éprouvez des difficultés à générer des thread dumps, vérifiez si cette option est activée.

UNIX, Mac OS X et Linux (JDK 1.4 ou version antérieure)

Sous UNIX, Mac OS X et Linux, vous pouvez envoyer un signal QUIT au processus Java pour lui indiquer de générer un thread dump dans la sortie standard.

  1. Pour ce faire, exécutez cette commande :
    kill -QUIT <pid>
    Il vous faudra peut-être exécuter cette commande comme suit : sudo -u user kill -QUIT <pid> où « user » est l’utilisateur sous l’identité duquel s’exécute le processus Java.
  2. Si vous commencez CQSE à l’aide du script crx-quickstart/server/start, les thread dumps seront générés dans crx-quickstart/server/logs/startup.log. Si vous utilisez un serveur d’applications tiers tel que JBoss, WebSphere, Tomcat ou autre, consultez la documentation du serveur pour savoir dans quel fichier est envoyée la sortie standard.
Windows :
JDK 1.X
  1. Téléchargez javadump.exe (ci-dessous).
  2. Démarrez la JVM avec ces trois arguments (ils doivent être dans le bon ordre) :
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C: mpjvmoutput.log
  3. Appuyez sur Ctrl+Maj+Échap pour ouvrir le Gestionnaire des tâches.
  4. Recherchez le PID du processus Java.
  5. À partir de la ligne de commande, exécutez
    javadump.exe [pid]
  6. Le thread dump apparaît dans le fichier jvmoutput.log mentionné à l’étape 2.
JDK 1.6

Générez un thread dump à l’aide de l’outil jconsole, en utilisant un module externe : [0]

Voici comment vous pouvez demander un thread dump :

  1. Ajoutez le paramètre suivant à la JVM exécutant Communique : -Dcom.sun.management.jmxremote
  2. Téléchargez et installez le JDK 1.6 (si ce n’est pas déjà fait).
  3. Téléchargez et décompressez l’utilitaire Thread Dump Analyzer. [1]
  4. Exécutez jconsole.exe du JDK 1.6 :
                                jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Cliquez sur l’onglet Thread dumps.
  6. Cliquez sur le lien Request Thread Dump.

Remarque : Si vous exécutez CQ5 et/ou CRX (avec Sling) et que vous souhaitez observer les threads en cours d’exécution, vous pouvez demander à http://<host>:<port>/system/console/threads d’obtenir une liste de threads. Toutefois, notez que ces thread dumps ne fonctionneront pas avec les outils d’analyse de thread dumps tels que samurai ou tda.

S’applique à

Tous les produits Adobe s’exécutant dans une JVM

[0] http://technet.microsoft.com/fr-fr/sysinternals/bb897553.aspx
[1] https://github.com/irockel/tda
[2] http://docs.day.com/fr/home/docutools/javadump_exe.html

Telechargement

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne