Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message
Options 参数说明如下:
选项
作用
-F
当正常输出的请求不被响应时,强制输出线程堆栈
-m
如果调用到本地方法的话,可以显示 C/C++ 的堆栈
-l
除堆栈外,显示关于锁的附加信息,在发生死锁时可以用 jstack -l pid 来观察锁持有情况
下面我们重点来聊一聊,jstack 中信息到底要怎么看。
jstack 堆栈信息介绍
下面是 jstack 输出的一段 tacer 数据
1 2 3 4 5
"main" #1 prio=5 os_prio=31 tid=0x00007fb93b802000 nid=0x2703 waiting on condition [0x0000700005e5d000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.glmapper.bridge.boot.TestJstack.testWaitingOnConditionCondition(TestJstack.java:19) at com.glmapper.bridge.boot.TestJstack.main(TestJstack.java:10)
"main" #1 prio=5 os_prio=31 tid=0x00007fb93b802000 nid=0x2703 waiting on condition [0x0000700005e5d000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.glmapper.bridge.boot.TestJstack.testWaitingOnConditionCondition(TestJstack.java:19) at com.glmapper.bridge.boot.TestJstack.main(TestJstack.java:10)
3、结果分析
这里就比较明显的是 main 线程中正在 sleep 方法。不过这里 TIMED_WAITING 后面的括号里还特殊表明了 sleeping,在一些场景下,常见的还有 parking,下面继续看例子。
"main" #1 prio=5 os_prio=31 tid=0x00007fd6d5008800 nid=0x2803 waiting on condition [0x000070000ffc1000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x000000076af3a938> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.ArrayBlockingQueue.put(ArrayBlockingQueue.java:353) at com.glmapper.bridge.boot.TestJstack.testWaitingOnConditionConditionWithParking(TestJstack.java:113) at com.glmapper.bridge.boot.TestJstack.main(TestJstack.java:13)
3、结果分析
main 线程进入了 waiting on conditon 状态,等待某一个资源,可以看到是在 a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObjec 进行了等待,阻塞住了。
"test-thread1" #14 prio=5 os_prio=31 tid=0x00007f9563880800 nid=0x5c03 waiting for monitor entry [0x000070000b029000] java.lang.Thread.State: BLOCKED (on object monitor) at com.glmapper.bridge.boot.TestJstack$2.run(TestJstack.java:50) - waiting to lock <0x000000076af261d0> (a java.lang.Object)
"test-thread" #13 prio=5 os_prio=31 tid=0x00007f956387f800 nid=0x5a03 waiting on condition [0x000070000af26000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.glmapper.bridge.boot.TestJstack$1.run(TestJstack.java:38) - locked <0x000000076af261d0> (a java.lang.Object)
"test-object-wait" #13 prio=5 os_prio=31 tid=0x00007fd43a809000 nid=0xa803 in Object.wait() [0x0000700010926000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x000000076af26140> (a com.glmapper.bridge.boot.TestJstack$3) at java.lang.Object.wait(Object.java:502) at com.glmapper.bridge.boot.TestJstack$3.run(TestJstack.java:73) - locked <0x000000076af26140> (a com.glmapper.bridge.boot.TestJstack$3)
"main" #1 prio=5 os_prio=31 tid=0x00007fd43b001800 nid=0x2603 waiting on condition [0x000070000f2e4000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.glmapper.bridge.boot.TestJstack.testObjectWait(TestJstack.java:93) - locked <0x000000076af26140> (a com.glmapper.bridge.boot.TestJstack$3) at com.glmapper.bridge.boot.TestJstack.main(TestJstack.java:10)
$ jmap -clstats 3493 Attaching to process ID 3493, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.172-b245 finding class loader instances ..done. computing per loader stat ..done. please wait.. computing liveness.......................liveness analysis may be inaccurate ... class_loader classes bytes parent_loader alive? type
<bootstrap> 3211 5818395 null live <internal> 0x00000000b150ed50 1 1491 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b8715670 1 900 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000cb417140 1 1503 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b98b4388 1 1491 null dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b5a419a0 1 900 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b358df50 1 1493 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b7b277b8 1 1503 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000c2527c58 1 1505 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b98b4580 1 1491 0x00000000b0026260 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b9b307b8 1 1493 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000e236b038 1 900 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b0108400 1 1493 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040 0x00000000b010bc00 3 7946 0x00000000b0022f60 live org/jacoco/compass/agent/rt/internal/fastjson/util/ASMClassLoader@0x00000001000eb830 0x00000000b358e148 1 1493 0x00000000b0020830 dead sun/reflect/DelegatingClassLoader@0x000000010000a040
$ jmap -dump:format=b,file=test-dump.bin 85716 # 举例 Dumping heap to /Users/guolei.sgl/test-dump.bin ... Heap dump file created
对于 dump 下来的文件,可以通过 jprofile 等图形化工具来分析,如下
也可以通过 jhat 查看,操作方式如下:
1、起 http 服务
1 2 3 4 5 6 7 8 9 10
jhat -port 9300 test-dump.bin Reading from test-dump.bin... Dump file created Wed Oct 28 17:54:24 CST 2020 Snapshot read, resolving... Resolving 1151952 objects... Chasing references, expect 230 dots...................................................................................................................................................................................................................................... Eliminating duplicate references...................................................................................................................................................................................................................................... Snapshot resolved. Started HTTP server on port 9300 Server is ready.