Environnement
Experience Manager
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 principaux 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é de consommer 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).
É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
Étape 2 : Demande d’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 parvenez 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
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.
Outil Saut de thread 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 images mémoire de threads.
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.
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.
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
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 de tâches.
Recherchez le PID du processus Java.
Depuis la ligne de commande, exécutez
javadump.exe <
pid>
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 :
Ajoutez le paramètre suivant au fichier 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 le fichier Utilitaire d’analyse de vidage de threads. [
1]
Exécuter jconsole.exe
de JDK 1.6 :
jconsole.exe -pluginpath /path/to/file/tda.jar
Cliquez sur le bouton Images mémoire de threads .
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 - Analyse 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.