Utiliser les images mémoire de threads d’une JVM
Une image mémoire des threads est une liste de tous les threads Java actuellement actifs dans une machine virtuelle Java (JVM). Cet article présente les différentes manières d’obtenir des images mémoire de threads à partir d’une JVM dans Adobe Experience Manager.
Description description
Environnement
Adobe Experience Manager
Problème/Symptômes
Comment obtenir des images mémoire de threads à partir d’une JVM sous Linux, UNIX ou Windows ?
Une image mémoire des 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 des images mémoire de threads d’une JVM. Il est vivement recommandé de prendre plus d’une image mémoire de thread. Une bonne pratique consiste à effectuer 10 images mémoire de threads à intervalle régulier (par exemple, une image mémoire de threads toutes les dix secondes).
Résolution resolution
Étape 1 : obtenir le PID de votre processus Java
La première information dont vous aurez besoin pour obtenir une image mémoire des threads 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 » correspond au nom d’utilisateur de l’utilisateur pour lequel le processus Java s’exécute.
Si cela ne fonctionne pas ou si vous ne parvenez toujours pas à trouver 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 une image mémoire des threads à partir de la JVM
jstack
S’il est installé/disponible, nous vous recommandons d’utiliser l’outil jstack. Cela imprime les images mémoire de threads dans la console de ligne de commande.
Pour obtenir une image mémoire des threads à l’aide de jstack, exécutez la commande suivante :jstack -l <pid>
Vous pouvez générer des images mémoire de threads consécutives dans un fichier à l’aide de la directive rediriger/ajouter de sortie de console :jstack -l <pid> >> threaddumps.log
Remarques :
-
L’outil jstack est disponible depuis JDK 1.5 (pour JVM sous Windows, il est disponible uniquement dans certaines versions de JDK 1.5 et JDK 1.6).
-
jstack fonctionne même si le paramètre jvm
-Xrsest activé -
Il n’est pas possible d’utiliser l’outil jstack à partir du JDK 1.6 pour récupérer 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 pour lequel le processus Java s’exécute) -
Sous Windows, si vous exécutez jstack et que l’erreur « Espace de stockage insuffisant pour traiter cette commande » s’affiche, vous devez exécuter jstack en tant qu’utilisateur SYSTEM de Windows ou en tant qu’utilisateur propriétaire du processus Java. Vous pouvez le faire en utilisant 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.logSi vous ne parvenez 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’utilisateur différent).
-
Si le processus java ne répond pas, il peut parfois être utile d’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 un script (adapté de celui de eclipse.org) qui prendra une série d’images mémoire 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 simplement 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 correspond au nombre d’images mémoire de threads à réaliser
- 3 est le délai entre chaque vidage
Remarque : la sortie supérieure comporte l’identifiant de thread natif au format décimal, tandis que la sortie jstack comporte l’identifiant en hexadécimal. Vous pouvez faire correspondre le thread à processeur élevé de la sortie supérieure à la sortie jstack en convertissant l’identifiant du thread en hexadécimal.
Outre le script ci-dessus, nous disposons également d’un script Windows Powershell) similaire et d’un script spécifique à Adobe AEM sur github.
Autres moyens d’obtenir une image mémoire des threads
Si l’outil jstack n’est pas disponible, vous pouvez effectuer des images mémoire de threads comme suit :
Remarque : certains outils ne peuvent pas utiliser les images mémoire de threads de la JVM si le -Xrs du paramètre de ligne de commande est activé. Si vous rencontrez des problèmes lors de la prise en charge des images mémoire de threads, vérifiez si cette option est activée.
UNIX, Mac OS X et Linux (JDK version 1.4 ou antérieure)
Sous UNIX, Mac OS X et Linux, vous pouvez envoyer un signal QUIT au processus Java pour lui demander de générer une image mémoire de thread vers la sortie standard.
-
Exécutez cette commande pour :
kill -QUIT <pid>Vous devrez peut-être exécuter cette commande en tant que
sudo -u user kill -QUIT <pid>où « user » correspond à l’utilisateur pour lequel le processus Java s’exécute. -
Si vous démarrez CQSE à l’aide du script
crx-quickstart/server/start, vos images mémoire de threads seront générées surcrx-quickstart/server/logs/startup.log. Si vous utilisez un serveur d’application tiers tel que JBoss, WebSphere, Tomcat ou autre, consultez la documentation du serveur pour savoir vers quel fichier la sortie standard est dirigée.
Windows :
JDK 1.X
- Téléchargez javadump.exe (joint ci-dessous).
- 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 - Appuyez sur Ctrl + Maj + Échap pour ouvrir le Gestionnaire des tâches.
- Recherchez le PID du processus Java.
- Sur la ligne de commande, exécutez :
javadump.exe <pid> - L’image mémoire des threads apparaîtra dans le fichier
jvmoutput.logmentionné à l’étape 2.
JDK 1.6
Obtenez une image mémoire des threads à partir de l’outil jconsole, en utilisant un plug-in : [ 0]
Voici comment demander une image mémoire des threads :
- Ajoutez le paramètre suivant à la jvm exécutant Communique :
Dcom.sun.management.jmxremote - Téléchargez et installez JDK 1.6 (si ce n’est pas encore fait).
- Téléchargez et extrayez l’utilitaire Thread Dump Analyzer.
[1] - Exécutez
jconsole.exedu JDK 1.6 :jconsole.exe -pluginpath /path/to/file/tda.jar - Cliquez sur l’onglet Images mémoire des threads.
- Cliquez sur le lien Extraction de thread de requête.
Remarque : si vous exécutez AEM 6.x et que vous souhaitez observer les threads en cours d’exécution, vous pouvez demander à http://<host>:<port>/system/console/status-Threads d’obtenir une liste des threads. Notez toutefois que ces images mémoire ne fonctionnent pas avec les outils d’analyse d’image mémoire de threads tels que samurai ou tda.
S’applique à :
Tous les produits Adobe exécutés dans une JVM
Outils d’analyse de vidage des threads
[ 0] PsExec v2.42 dans Sysinternals dans la documentation de Microsoft.
[ 1] TDA - Thread Dump Analyzer sur irockel/tda sur Github.com.
[ 2] Java Thread Dump Analyzer sur FastThread.
[ 3] Analyseur de vidage de thread et de moniteur IBM pour Java dans la documentation de l’assistant de support IBM.