Comment faire pour générer un thread dump d’une JVM sous Linux, 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 décharges de fils d’une JVM. Il est vivement recommandé de générer plusieurs décharges de fils. 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 propriétaire du processus java :
    sudo -u java-user jstack -l <pid>  
    (<java-user> doit être remplacé par l’identifiant de l’utilisateur sous lequel le processus Java est exécuté)
  • 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 jstack en tant qu’utilisateur SYSTEM, utilisez une commande comme celle-ci :
    psexec -s jstack <pid>  >> threaddumps.log
    Si vous ne pouvez pas installer psexec sur le serveur, alors vous créez un fichier.bat contenant cette commande et exécutez la en utilisant le planificateur de tâches Windows (sous un utilisateur différent.)..
  • Si le processus java ne répond pas, il peut s’avérer utile d’utiliser l’option -J-d64 (sur un système 64 bits), par exemple :
    jstack -J-d64 -l <pid> >> threaddumps.log
  • Si la commande jstack (jstack -l <pid> >> threaddumps.log) renvoie l’erreur [1] ci-dessous, exécutez la de nouveau en tant qu’utilisateur propriétaire du processus java.  Par exemple :
    sudo -u sling jstack -l <pid> >> threaddumps.log
[1] 
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

 

Script jstack

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

Exécutez-le comme suit :
sudo -u <user> jstackSeries.sh <pid> <aemserveruser> <count> <delay>

Par exemple :
sudo -u aemuser jstackSeries.sh 1234 aemserveruser 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.

Outre le script ci-dessus, nous disposons également d’un même script Windows Powershellet et d’un script spécifique à Adobe AEM sur github.

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. Exécutez cette commande pour effectuer cette opération :
    kill -QUIT <pid>
    Vous devrez peut-être exécuter cette commande sous la forme sudo -u user kill -QUIT <pid> où « user » est l’utilisateur sous lequel le processus Java est exécuté.
  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 algorithmes (ils doivent être dans le bon ordre) :
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C:\temp\jvmoutput.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 de 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 utilisez AEM 6.* et que vous souhaitez observer les discussions en cours, vous pouvez demander à obtenir une liste de discussions en accédant à http://<host>:<port>/system/console/status-Threads. Toutefois, veuillez noter que ces images mémoire de threads ne fonctionneront pas avec les outils d’analyse des images mémoire de threads tels que samurai ou tda.

S’applique à

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

Outils d’analyse des images mémoire de threads :

[0] https://docs.microsoft.com/fr-fr/sysinternals/downloads/psexec
[1] https://github.com/irockel/tda
[2] https://fastthread.io/
[3] https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm

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