本文记录下java阻塞线程或繁忙线程的定位方式
测试或生产环境偶尔会遇到线程阻塞或cpu飙升的问题,我们经常使用以下工具进行定位和分析,对分析命令和需要注意的点进行记录。
1、arthas thread命令
2、jstack命令
一、arthas-thread命令
// 找到当前持有锁,且阻塞最多线程的的线程
thread -b
// 打印最耗cpu的线程
thread -n 3
二、jstack命令
分为以下几步:
1、top或jps命令查询进程id
2、top -Hp 命令查询到最繁忙的线程号
3、printf “%x” 线程号,得到十六进制线程号
4、jstack [进程号] | grep [十六进制线程号] -A 30 查询该线程堆栈信息前30行
为了方便,将以上命令合并为一条:
// 'nid=0x' 使用其作为grep的关键字防止匹配到其他线程堆栈信息
jstack 15 | grep `printf 'nid=0x%x' 220` -A 30
// 另外,可以通过以下命令查询进程中最繁忙的线程
ps -mp 15 -o THREAD,tid | sort -r | head -n 6
除此之外,在无法直接定位的情况,建议jstack 15 > stack.txt将所有堆栈dump到本地,使用文本工具进一步对比查询。