Le dump de thread Java est une liste de tous les threads actifs dans la JVM.
Dump de thread Java
Le dump de thread Java est très utile pour analyser les goulets d’étranglement dans l’application et les situations de deadlock. Ici, nous allons apprendre plusieurs façons de générer un dump de thread pour un programme Java. Ces instructions sont valables pour les systèmes d’exploitation *nix, mais sur Windows, les étapes peuvent être légèrement différentes.
- Profileur VisualVM: Si vous analysez une application pour sa lenteur, vous devez utiliser un profileur. Nous pouvons générer un dump de thread pour n’importe quel processus en utilisant le profileur VisualVM très facilement. Vous avez juste besoin de faire un clic droit sur le processus en cours d’exécution et de cliquer sur l’option « Thread Dump » pour le générer.
- jstack: Java est livré avec l’outil jstack grâce auquel nous pouvons générer un dump de thread pour un processus Java. C’est un processus en deux étapes.
- Trouver le PID du processus Java en utilisant la commande
ps -eaf | grep java
- Exécutez l’outil jstack comme
jstack PID
pour générer la sortie du dump de thread à la console, vous pouvez ajouter la sortie du dump de thread à un fichier en utilisant la commande «jstack PID >> mydumps.tdump
« - Nous pouvons utiliser la commande
kill -3 PID
pour générer le vidage de thread. Cela est légèrement différent des autres moyens de générer un vidage de thread. Lorsque la commande kill est exécutée, un vidage de thread est généré vers la sortie système du programme. Donc, si c’est un programme Java avec la console comme sortie système, le vidage de thread sera imprimé sur la console. Si le programme Java est un serveur Tomcat avec la sortie système commecatalina.out
, alors le vidage de thread sera généré dans le fichier. - Java 8 a introduit l’utilitaire
jcmd
. Vous devriez utiliser cela à la place de jstack si vous êtes sur Java 8 ou supérieur. La commande pour générer un vidage de thread en utilisant jcmd estjcmd PID Thread.print
.
</diy14
Au-dessus se trouvent quatre façons différentes de générer un vidage de thread en Java. Habituellement, je préfère la commande jstack ou jcmd pour générer un vidage de thread et l’analyser. Notez que quelle que soit la méthode choisie, le vidage de thread sera toujours le même.
Exemple de vidage de thread Java
Dans mon dernier message, j’ai expliqué à propos de java Timer, voici un vidage de thread généré pour le même programme.
2012-12-26 22:28:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):
"Attach Listener" daemon prio=5 tid=0x00007fb7d8000000 nid=0x4207 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Timer-0" daemon prio=5 tid=0x00007fb7d4867000 nid=0x5503 waiting on condition [0x00000001604d9000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.journaldev.threads.MyTimerTask.completeTask(MyTimerTask.java:19)
at com.journaldev.threads.MyTimerTask.run(MyTimerTask.java:12)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
"Service Thread" daemon prio=5 tid=0x00007fb7d482c000 nid=0x5303 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=5 tid=0x00007fb7d482b800 nid=0x5203 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=5 tid=0x00007fb7d4829800 nid=0x5103 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=5 tid=0x00007fb7d4828800 nid=0x5003 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=5 tid=0x00007fb7d4812000 nid=0x3f03 in Object.wait() [0x000000015fd26000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)
"Reference Handler" daemon prio=5 tid=0x00007fb7d4811800 nid=0x3e03 in Object.wait() [0x000000015fc23000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=0x00007fb7d5000800 nid=0x1703 waiting on condition [0x0000000106116000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.journaldev.threads.MyTimerTask.main(MyTimerTask.java:33)
"VM Thread" prio=5 tid=0x00007fb7d480f000 nid=0x3d03 runnable
"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fb7d500d800 nid=0x3503 runnable
"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fb7d500e000 nid=0x3603 runnable
"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fb7d5800000 nid=0x3703 runnable
"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fb7d5801000 nid=0x3803 runnable
"GC task thread#4 (ParallelGC)" prio=5 tid=0x00007fb7d5801800 nid=0x3903 runnable
"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fb7d5802000 nid=0x3a03 runnable
"GC task thread#6 (ParallelGC)" prio=5 tid=0x00007fb7d5802800 nid=0x3b03 runnable
"GC task thread#7 (ParallelGC)" prio=5 tid=0x00007fb7d5803800 nid=0x3c03 runnable
"VM Periodic Task Thread" prio=5 tid=0x00007fb7d481e800 nid=0x5403 waiting on condition
JNI global references: 116
Le vidage de fil est la liste de tous les fils, chaque entrée montre des informations sur le fil qui incluent les éléments suivants dans l’ordre d’apparition.
- Nom du fil: Nom du fil
- Priorité du fil: Priorité du fil
- ID du fil: Représente l’ID unique du fil
- État du fil: Fournit l’état actuel du fil, par exemple, RUNNABLE, WAITING, BLOCKED. Lors de l’analyse des blocages, recherchez les fils bloqués et les ressources sur lesquelles ils tentent d’acquérir un verrou.
- Pile d’appel du fil: Fournit des informations cruciales sur la pile pour le fil. C’est l’endroit où nous pouvons voir les verrous obtenus par le fil et s’il attend un verrou quelconque.
C’est tout pour le vidage de fil en Java.
Source:
https://www.digitalocean.com/community/tutorials/java-thread-dump-visualvm-jstack-kill-3-jcmd