Récupérer les thread dumps à partir d’une JVM

Dernière mise à jour : 2023-10-30

Description

Environnement

Experience Manager

Problème/Symptômes

Comment récupérer les images mémoire de threads d’une JVM sous Linux, UNIX ou Windows ?

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

Il existe plusieurs façons de récupérer les images mémoire de threads d’une JVM. Il est vivement recommandé d’utiliser plus d’un vidage de thread. Une bonne pratique consiste à effectuer 10 vidages de thread à un intervalle régulier (par exemple, un vidage de thread toutes les dix secondes).

Résolution

Étape 1 : Obtention du PID de votre processus Java

Le premier élément d’information dont vous aurez besoin pour obtenir un vidage de thread est le PID de votre processus Java.

Le JDK Java est fourni avec la commande jps qui répertorie tous les identifiants 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 en tant que sudo -u user jps -l, où "user" est le nom d’utilisateur sous lequel s’exécute le processus Java.

Si cela ne fonctionne pas ou si vous ne trouvez toujours pas votre processus Java (chemin non défini, JDK non installé ou ancienne version de Java), utilisez

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

Étape 2 : demander un vidage de thread à partir de la JVM

jstack

Si elle est installée/disponible, il est recommandé d’utiliser la variable jstack outil. Il imprime les images mémoire de threads dans la console de ligne de commande.

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

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

Remarques :

  • L’outil jstack est disponible depuis JDK 1.5 (pour JVM sous Windows, il est disponible dans certaines versions de JDK 1.5 et JDK 1.6 uniquement).

  • jstack fonctionne même si la variable -Xrs le paramètre jvm est activé

  • Il n’est pas possible d’utiliser l’outil jstack de JDK 1.6 pour extraire les images mémoire de threads d’un processus s’exécutant sur 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 jstack et obtenez l’erreur "Pas assez de stockage pour traiter cette commande", vous devez exécuter jstack en tant qu’utilisateur Windows SYSTEM ou utilisateur propriétaire du processus Java.  Vous pouvez le faire en utilisant psexec que vous pouvez télécharger. here. 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, vous pouvez créer un fichier .bat contenant la commande et l’exécuter. utilisation du planificateur de tâches Windows (en tant qu’utilisateur différent).

  • Si le processus java ne répond pas, il peut parfois aider à utiliser l’option . -J-d64 (sur les systèmes 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 commande en tant qu’utilisateur propriétaire du processus java.  Par exemple:

    sudo -u sling jstack -l < pid> > > threaddumps.log

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 une script (adapté de celui sur eclipse.org) qui prend une série de vidages de threads à l’aide de jstack.  Il utilise é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 lequel le processus Java s’exécute.
  • 10 représente le nombre de vidages de fil à prendre.
  • 3 est le délai entre chaque vidage.

Remarque : La sortie supérieure a l’identifiant de thread natif au format décimal tandis que la sortie jstack a l’identifiant en hexadécimal.  Vous pouvez faire correspondre le thread de processeur élevé de la sortie supérieure à la sortie jstack en convertissant l’identifiant de thread en hexadécimal.

Outre le script ci-dessus, nous avons également un Script Windows PowerShell et script spécifique à un Adobe AEM sur github.

MOYENS ALTERNATIFS D’OBTENIR UN DÉPÔT DE THREAD

Si la variable jstack n’est pas disponible pour vous, vous pouvez utiliser les images mémoire de threads comme suit :

Remarque : Certains outils ne peuvent pas récupérer les images mémoire de thread de la JVM si le paramètre de ligne de commande -Xrs est activée. Si vous rencontrez des problèmes lors de la prise de thread dumps, vérifiez si cette option est activée.

UNIX, Mac OS X et Linux (JDK 1.4 ou version infé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 vidage de threads en sortie standard.

  1. Exécutez cette commande pour effectuer les opérations suivantes :

    kill -QUIT <pid>

    Vous devrez peut-être exécuter cette commande en tant que sudo -u user kill -QUIT <pid> où "user" est l’utilisateur sous lequel s’exécute le processus Java.

  2. Si vous démarrez CQSE à l’aide de la variable crx-quickstart/server/start script , vos images mémoire de threads seront alors générées vers 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 à quel fichier est dirigé la sortie standard.

Windows:

JDK 1.X

  1. Téléchargez javadump.exe (joint 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:\temp\jvmoutput.log

  3. Appuyez sur Ctrl+Maj+Échap pour ouvrir le Gestionnaire de tâches.

  4. Recherchez le PID du processus Java.

  5. Depuis la ligne de commande, exécutez

    javadump.exe <pid>

  6. Le thread dump apparaît dans la jvmoutput.log fichier mentionné à l’étape 2.

JDK 1.6

Obtenir un vidage de thread à partir de jconsole en utilisant un module externe : [ 0]

Voici comment demander un vidage de thread :

  1. Ajoutez le paramètre suivant au fichier jvm exécutant Communique : -Dcom.sun.management.jmxremote

  2. Téléchargez et installez JDK 1.6 (si ce n’est pas encore fait).

  3. Téléchargez et extrayez le fichier Utilitaire d’analyse de vidage de threads. [ 1]

  4. Exécuter jconsole.exe de JDK 1.6 :

    jconsole.exe -pluginpath /path/to/file/tda.jar

  5. Cliquez sur le bouton Images mémoire de threads .

  6. Cliquez sur le bouton Saut de thread de requête lien.

Remarque : Si vous exécutez AEM 6.* et que vous souhaitez observer les threads en cours d’exécution, vous pouvez demander http://<host>:<port>/system/console/status-Threads pour obtenir une liste de threads. Toutefois, notez que ces images mémoire de threads ne fonctionneront pas avec les outils d’analyse de thread dump tels que samurai ou tda.

Application

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

Outils d’analyse de vidage de threads :

[ 0]  PsExec v2.42 dans la documentation Sysinternals dans Microsoft.
[ 1] TDA - Analyseur de vidage de threads sur irockel/tda sur Github.com.
[ 2]  Analyseur de vidage des threads Java sur FastThread.
[ 3]  Analyseur de vidage de threads et de moniteurs IBM pour Java sur la documentation de l’assistant d’assistance IBM.

Sur cette page