提要
线程转储可用于分析Java应用在某一运行时刻的内部线程的运行情况,包括线程数、线程状态(死锁、运行、等待等),并且可得到线程的执行轨迹,对于分析线程死锁十分有益。
通过JDK内置的工具jstack
可转储Java线程:sudo -u tomcat jstack -l <java_pid> > jstack.dump
,注意,<java_pid>
为主进程ID,无法dump某个线程。
获取Java线程ID:
ps aux | grep java
;
需确保转储用户与线程用户相同,否则,易出现Unable to open socket file: target process not responding or HotSpot VM not loaded的问题;
当出现死锁时,dump操作可能失败,可以通过kill -3 <java_pid>
终止死锁(其不会杀死进程或线程!);
得到转储文件后,可将其上传到fastThread进行在线分析,该服务可提供直观的分析图表和相关报告。
也可以下载IBM提供的工具IBM Thread and Monitor Dump Analyze,其同样提供图表分析功能,但整体上没有fastThread的直观。其启动命令为:java -jar jca447.jar
。