jstack分析Java进程信息
1.查出当前Java程序的进程ID (19893)
ps -ef|grep java 与 ps -aux|grep java 都是查询进程信息,aux是BSD风格,-ef是System V风格。主要区别是aux会截断command列,而-ef不会。
2.查看当前进程的各个线程使用情况
top -Hp {pid} #查看当前进程的线程CPU使用情况
top -Hp 19893 # (注意这下面的pid 19894 ,19895...26983 则不是进程id了,而是线程ID)
3.jstack通过查看进程详情来查看进程里线程的状态
jstack 19893
在top命令中,已经获取到了线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可
nid对应top -Hp 19893命令结果中的某个线程id ,十六进制!
eg: 十六进制: nid=0x690d 对应 十进制:pid=26893 (第2点图片中最后一行的pid) ,其它线程也是如此对应~
进制转换参考文章:https://www.cnblogs.com/summerdata/p/10722144.html
dump 文件里值得关注的线程状态有以下几种
死锁: Deadlock(重点关注) 执行中:Runnable 等待资源: Waiting on condition(重点关注) 等待获取监视器: Waiting on monitor entry(重点关注) 暂停:Suspended 对象等待中:Object.wait() 或 TIMED_WAITING 阻塞: Blocked(重点关注) 停止:Parked
ps: 还需要关注一下 locked信息,locked的对象是否会死锁。
知识小分享:
lsof -P {pid} #查看当前进程的引用文件信息 eg: lsof -P 19893 lsof -i:8080 #查看当前端口的网络访问信息
top -Hp {pid} #查看当前进程的线程使用情况 eg: top -Hp 19893