1. Introduction
Un dump de threads est une vue à un instant T de tous les threads d'un processus Java. L'état de chaque thread est présenté avec une trace de pile montrant le contenu de la pile du thread.
Comme le dump affiche l'activité des différents threads, il est utile pour effectuer diagnostiquer les problèmes tels que les pics de CPU, les blocages de processus, des problèmes de performances, des problèmes de mémoire ou des applications qui ne répondent plus.
Il existe d'excellents outils en ligne d'analyse de dump de threads tels que fastthread.io, ces outils analysent et repèrent les problèmes.
2. En utilisant les outils du JDK
Le JDK procurent plusieurs outils qui permettent de capturer les threads d'un processus Java. Tous ces outils sont situés dans le répertoire bin du répertoire d'installation du JDK.
Ils peuvent être exécutés depuis une console Ligne de commande.
Les différents outils nécessitent de connaitre l'identifiant du processus Java dont on souhaite capturer les threads. Vous pouvez obtenir l'identifiant des processus Java à l'aide de la commande jps ou de la commande ps.
2.1. jstack
jstack est un outil du JDK qui permet de capture les threads d'un processus Java. Il prend comme paramètre l'identifiant du processus et retourne le résultat de la capture dans la console.
jstack [-F] [-l] [-m] <pid> Toutes les options sont facultatives :
- L'option -F force la capture des threads. Cette option est pratique à utiliser lorsque la capture ne s'effectue pas en raison du blocage du processus.
- L'option -l indique à l'outil de rechercher des synchroniseurs possédables dans la heap et les verrous
- L'option -m affiche en plus de la stack Java les stacks native (C & C++)
Pour conserver la capture dans un fichier, vous pouvez rediriger la sortie vers un fichier :
jstack 17264 > /tmp/threaddump.txt
2.2. jcmd
L'outil jcmd a été introduit avec la version 7 du JDK Oracle. Il est très utile pour diagnostiquer des problèmes avec des applications JVM.
Il offre différentes fonctionnalités telles que l'identification des identifiants des processus Java, la capture de threads, l'obtention des statistiques des collections Garbage, ...
Pour effectuer une capture de threads, utilisez la commande suivante :
jcmd <pid> Thread.print > <file_path>
Où :
- <pid> est l'identifiant de votre processus Java
- <file_path> est l'emplacement du fichier dans lequel la capture des threads sera écrite
Exemple :
jcmd 37320 Thread.print > /tmp/threaddump.txt
2.3. Autres outils
Le JDK comprend d'autres outils capables de capturer les threads d'un processus Java, tels que Java Mission Control, jvisualvm, jconsole.
3. A partir de la ligne de commande
3.1. Commande kill (Linux / Unix)
Le moyen le plus simple pour effectuer une capture de threads dans un environnement Linux / Unix est d'utiliser la commande kill. Nous utiliserons cette commande pour envoyer un signal au processus utilisant l'appel système kill(). Dans notre cas, nous enverrons le signal -3.
kill -3 <pid>
En recevant ce signal, le processus Java va afficher dans la sortie standard la capture des threads.
Si le processus Java s'exécute avec la combinaison d'options suivantes, alors il est possible de rediriger la sortie vers un fichier.
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=~/jvm.log
3.2 Ctrl + Break (Windows)
Dans un environnement Windows, vous pouvez capture les threads en utilisant la combinaison de touches CTRL et Break.
Pour effectuer une capture des threads, naviguez vers la console utilisée pour exécuter l'application Java et pressez en même temps les touches CTRL et Break.
A noter que sur certains claviers la touche Break n'est pas disponible. Dans ce cas, pour effectuer une capture, il faut presser ensemble les touches CTRL, SHIFT et Pause.
Ces deux commandes affichent la capture des threads dans la console.