jstack是JDK自带的线程栈分析工具,它可以生成当前JVM所有线程信息的快照,我们可以查看虚拟机中都有哪些线程,以及各个线程是在正常运行还是等待资源,进而定位死锁等问题。
jstack <pid>
-l
参数:使用jstack -l <pid>
能够额外打印锁信息,该参数用于定位死锁问题一个输出信息的例子如下。
2023-01-26 13:42:30
Full thread dump OpenJDK 64-Bit Server VM (11.0.2+9 mixed mode):
Threads class SMR info:
_java_thread_list=0x000001d7a3e25be0, length=11, elements={
0x000001d787b95000, 0x000001d7a31f8000, 0x000001d7a3223800, 0x000001d7a3b43000,
0x000001d7a3248800, 0x000001d7a324a800, 0x000001d7a324b800, 0x000001d7a325e000,
0x000001d787c5a000, 0x000001d7a3e1f000, 0x000001d7a3e22000
}
"main" #1 prio=5 os_prio=0 cpu=0.00ms elapsed=3626.65s tid=0x000001d787b95000 nid=0x5238 in Object.wait() [0x000000387bffe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000000fff068b0> (a java.lang.Thread)
at java.lang.Thread.join(java.base@11.0.2/Thread.java:1305)
- waiting to re-lock in wait() <0x00000000fff068b0> (a java.lang.Thread)
at java.lang.Thread.join(java.base@11.0.2/Thread.java:1379)
at com.gacfox.demo.Main.main(Main.java:7)
"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a31f8000 nid=0x5528 waiting on condition [0x000000387c6ff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.2/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@11.0.2/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.2/Reference.java:213)
"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a3223800 nid=0x97c0 in Object.wait() [0x000000387c7fe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000000fff08f10> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x00000000fff08f10> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.2/Finalizer.java:170)
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a3b43000 nid=0x9bac runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #5 daemon prio=5 os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a3248800 nid=0x2c4c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a324a800 nid=0x89e4 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C1 CompilerThread0" #14 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a324b800 nid=0x3f58 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"Sweeper thread" #18 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=3626.63s tid=0x000001d7a325e000 nid=0x7b40 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Common-Cleaner" #19 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=3626.62s tid=0x000001d787c5a000 nid=0x933c in Object.wait() [0x000000387cdff000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000000ffe2b920> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x00000000ffe2b920> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@11.0.2/CleanerImpl.java:148)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
at jdk.internal.misc.InnocuousThread.run(java.base@11.0.2/InnocuousThread.java:134)
"Monitor Ctrl-Break" #20 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=3626.59s tid=0x000001d7a3e1f000 nid=0xb804 runnable [0x000000387d1fe000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(java.base@11.0.2/Native Method)
at java.net.SocketInputStream.socketRead(java.base@11.0.2/SocketInputStream.java:115)
at java.net.SocketInputStream.read(java.base@11.0.2/SocketInputStream.java:168)
at java.net.SocketInputStream.read(java.base@11.0.2/SocketInputStream.java:140)
at sun.nio.cs.StreamDecoder.readBytes(java.base@11.0.2/StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(java.base@11.0.2/StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(java.base@11.0.2/StreamDecoder.java:178)
- locked <0x00000000ffdfa460> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(java.base@11.0.2/InputStreamReader.java:185)
at java.io.BufferedReader.fill(java.base@11.0.2/BufferedReader.java:161)
at java.io.BufferedReader.readLine(java.base@11.0.2/BufferedReader.java:326)
- locked <0x00000000ffdfa460> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(java.base@11.0.2/BufferedReader.java:392)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:55)
"Service Thread" #21 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=3626.59s tid=0x000001d7a3e22000 nid=0x8da0 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=2 cpu=0.00ms elapsed=3626.64s tid=0x000001d7a31f5800 nid=0x4248 runnable
"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=3626.65s tid=0x000001d787bae800 nid=0x21e0 runnable
"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=3626.65s tid=0x000001d787bb7000 nid=0xbaa4 runnable
"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=3626.65s tid=0x000001d787bb8800 nid=0x2254 runnable
"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=3626.65s tid=0x000001d787c52000 nid=0xc304 runnable
"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=3626.65s tid=0x000001d787c54000 nid=0x42e4 runnable
"VM Periodic Task Thread" os_prio=2 cpu=0.00ms elapsed=3626.59s tid=0x000001d7a3e23800 nid=0x7d34 waiting on condition
JNI global refs: 24, weak refs: 0