jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。
生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待问题。这些都是导致线程长时间停顿的原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
在Thread Dump中,需要留意下面几中状态:
- 死锁:DeadLock(重点关注)
- 等待资源:Waiting On Condition(重点关注)
- 等待获取监视器:Waiting On Monitor Entry(重点关注)
- 阻塞:Blocked(重点关注)
- 执行中:Runnable
- 暂停:Suspended
- 对象等待中:Object.wait( )或者TIMED_WAITING
- 停止:Parked
如下,我们能看到每个线程当前是一个什么状态。其中我们重点关注名字为:"Thread-0"这个线程,它的状态为:TIMED_WAITING
C:\Users\lenovo>jstack 27888
2021-06-19 16:46:15
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.91-b15 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000003033000 nid=0x6a90 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-0" #12 prio=5 os_prio=0 tid=0x0000000016f22000 nid=0x75ec waiting on condition [0x00000000176ff000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.booyue.tlh.gclog.TestJVMTools.lambda$main$0(TestJVMTools.java:15)
at com.booyue.tlh.gclog.TestJVMTools$$Lambda$1/1313922862.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x0000000015382000 nid=0x6b78 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x00000000152d6800 nid=0x5d64 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x00000000152d3000 nid=0x6d80 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x00000000152d2000 nid=0x3518 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x00000000152cf800 nid=0x375c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x00000000152c9800 nid=0x68bc runnable [0x00000000167fe000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked <0x00000000ff808a88> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked <0x00000000ff808a88> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000015166000 nid=0x46f8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000015165800 nid=0x57d0 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000015143800 nid=0x6870 in Object.wait() [0x000000001649f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000013a6d000 nid=0x3b44 in Object.wait() [0x000000001639e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Thread" os_prio=2 tid=0x0000000015122800 nid=0x6a58 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003048800 nid=0x6468 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000304a000 nid=0x3e64 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000304b800 nid=0x1d18 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000304d000 nid=0x3260 runnable
"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x000000000304f800 nid=0x3db4 runnable
"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003051800 nid=0x4794 runnable
"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000003054800 nid=0x7658 runnable
"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000003056000 nid=0xd80 runnable
"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x0000000003057000 nid=0x74b8 runnable
"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x0000000003058000 nid=0x59b0 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x0000000015409000 nid=0x58dc waiting on condition
JNI global references: 335
除了堆栈信息除外,通过option参数 -l 还可以显示锁的附加信息:
C:\Users\lenovo>jstack -l 15948
2021-06-19 16:57:35
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.91-b15 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000002c73000 nid=0x8c0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-0" #12 prio=5 os_prio=0 tid=0x0000000016b72000 nid=0x708c waiting on condition [0x000000001731f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.booyue.tlh.gclog.TestJVMTools.lambda$main$0(TestJVMTools.java:15)
at com.booyue.tlh.gclog.TestJVMTools$$Lambda$1/1313922862.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x0000000014fd7000 nid=0x3148 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x0000000014f31000 nid=0x2f68 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x0000000014f2c800 nid=0x35dc waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x0000000014f29800 nid=0x71e0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x0000000014f27000 nid=0x5668 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x0000000014f22800 nid=0x3474 runnable [0x000000001641e000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked <0x00000000ff808a88> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked <0x00000000ff808a88> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
Locked ownable synchronizers:
- None
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000014e03000 nid=0x53f8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000014e00000 nid=0x766c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000014d93000 nid=0x908 in Object.wait() [0x000000001611f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000136ad000 nid=0x6cc8 in Object.wait() [0x000000001601e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 tid=0x0000000014d72800 nid=0x6378 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002c88800 nid=0x1a28 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002c8a000 nid=0x3d5c runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002c8b800 nid=0x66c0 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002c8d000 nid=0x194c runnable
"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000002c8f800 nid=0x7088 runnable
"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000002c91800 nid=0x7568 runnable
"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000002c94800 nid=0x2298 runnable
"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000002c96000 nid=0x15b0 runnable
"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x0000000002c97000 nid=0x71c8 runnable
"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x0000000002c98000 nid=0x600 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x000000001504c800 nid=0x2478 waiting on condition
JNI global references: 335