Il dump dei thread di Java è un elenco di tutti i thread attivi nella JVM.
Java Thread Dump
Il dump dei thread di Java è molto utile per analizzare i colli di bottiglia nell’applicazione e le situazioni di deadlock. Qui impareremo più modi attraverso i quali possiamo generare un dump dei thread per un programma Java. Queste istruzioni sono valide per i sistemi operativi *nix, ma in Windows i passaggi potrebbero essere leggermente diversi.
- Profiler VisualVM: Se stai analizzando un’applicazione per la lentezza, devi utilizzare un profiler. Possiamo generare un dump dei thread per qualsiasi processo utilizzando il profiler VisualVM molto facilmente. Devi solo fare clic con il pulsante destro sul processo in esecuzione e fare clic su “Thread Dump” per generarlo.
- jstack: Java dispone dello strumento jstack attraverso il quale possiamo generare un dump dei thread per un processo Java. Si tratta di un processo in due fasi.
- Scopri il PID del processo Java utilizzando il comando
ps -eaf | grep java
- Esegui lo strumento jstack come
jstack PID
per generare l’output del dump dei thread sulla console. Puoi aggiungere l’output del dump dei thread a un file utilizzando il comando “jstack PID >> mydumps.tdump
”
- Scopri il PID del processo Java utilizzando il comando
- Possiamo utilizzare il comando
kill -3 PID
per generare il thread dump. Questo è leggermente diverso dagli altri modi per generare il thread dump. Quando viene emesso il comando di kill, il thread dump viene generato sul System out del programma. Quindi, se si tratta di un programma Java con console come System out, il thread dump verrà stampato sulla console. Se il programma Java è un server Tomcat con System out comecatalina.out
, allora il thread dump verrà generato nel file. - Java 8 ha introdotto l’utilità
jcmd
. Dovresti usarlo invece di jstack se sei su Java 8 o versioni successive. Il comando per generare il thread dump usando jcmd èjcmd PID Thread.print
.
Sopra ci sono quattro modi diversi per generare il thread dump in Java. Di solito preferisco il comando jstack o jcmd per generare e analizzare il thread dump. Nota che qualunque sia il modo scelto, il thread dump sarà sempre lo stesso.
Esempio di Thread Dump Java
Nel mio ultimo post, ho spiegato riguardo a java Timer, ecco un thread dump generato per lo stesso programma.
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
Dump dei thread è l’elenco di tutti i thread, ogni voce mostra informazioni sul thread che includono quanto segue nell’ordine di apparizione.
- Nome del Thread: Nome del Thread
- Priorità del Thread: Priorità del thread
- ID del Thread: Rappresenta l’ID univoco del Thread
- Stato del Thread: Fornisce lo stato corrente del thread, ad esempio ESEGUIBILE, IN ATTESA, BLOCCATO. Durante l’analisi del deadlock, cercare i thread bloccati e le risorse su cui stanno cercando di acquisire il blocco.
- Callstack del Thread: Fornisce informazioni vitali sulla pila per il thread. Questo è il luogo in cui possiamo vedere i blocchi ottenuti dal Thread e se sta aspettando un blocco.
Ecco tutto per il dump dei thread in Java.
Source:
https://www.digitalocean.com/community/tutorials/java-thread-dump-visualvm-jstack-kill-3-jcmd