🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 线程堆栈是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的Thread Dump的能力; 线程堆栈是虚拟机中线程(包括锁)状态的一个**瞬间状态**的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况; ### **线程堆栈信息构成** 1、线程名字,PID,线程的数量等; 2、线程的运行状态,锁的状态(锁被哪个线程持有,哪个线程在等待锁等); 3、调用堆栈包含完整的类名,所执行的方法,源代码的行数等; ### **关注的线程状态** 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 暂停,Suspended 对象等待中,Object.wait() 或 TIMED_WAITING 阻塞,Blocked(重点关注) 停止,Parked ### **线程栈能分析如下性能问题** 1、系统cpu过高; 2、性能瓶颈,如响应时间长但CPU资源并不高 ; 3、系统运行越来越慢,响应时间长; 4、系统挂起,长时间无响应或响应时间长; 5、线程死锁,死循环等; 6、由于线程数量太多导致的内存溢出(如无法创建线程等); 7、查找内存泄露; ### **如何使用** >[danger] > 1、线程栈是瞬时记录,所以没有历史消息的回溯,经常需要打印几次做对比分析,同时一般都需要结合程序的日志进行跟踪; > 2、在实际运行中,往往一次的dump信息并不足以确认问题,为了反映线程状态的变化,需要多次进行thread dump,每次间隔10 - 20s,建议不少于3次,如果每次都指向同一个问题,方能确认问题所在; ## 二、获取线程堆栈 首先找到Java线程PID ``` jps -lv ``` 传入Java线程PID ``` jstack -l ${pid} > jstack.out ``` 就可以从jstack.out中看到Java线程堆栈; ## 三、实例 ![](https://img.kancloud.cn/61/a1/61a1ade4ce9d3eac104157b597019e77_1058x543.png)