jstack介绍:
jstack用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
在dump文件里,值得关注的线程状态有:
- 死锁,Deadlock(重点关注) 。
- 执行中,Runnable。
- 等待资源,Waiting on condition(重点关注)。
- 等待获取监视器,Waiting on monitor entry(重点关注)。
- 暂停,Suspended。
- 对象等待中,Object.wait() 或 TIMED_WAITING。
- 阻塞,Blocked(重点关注)。
- 停止,Parked。
命令格式
打印进程线程转储命令: jstack -l PID > /data/dump/jstack.txt
dump格式
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f7b54101800 nid=0x69d0 in Object.wait() [0x00007f7b4416c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000f5cd91e0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x00000000f5cd91e0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
Locked ownable synchronizers:
- None
值 | 含义 |
Finalizer | 线程名称 |
prio=8 | 线程的优先级,数字从1到10,其中1为最低,10为最高优先级 |
tid=0x00007f7b54101800 | 线程ID |
nid=0x69d0 | 本地硬件线程id |
Object.wait() | 线程状态,此状态为对象等待中 |