一、cpu问题现像
举个例纸:
第一步:我轻轻一压,才用了5个线程 ,cpu就被占满了,平均负载也很高
第二步:用pidstat 1 (用于监控全部或指定进程的cpu情况,每1秒刷新一次)
记住这个进程号,后面排查问题有用:11938
PID:进程ID
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令
第三步:知道了这个进程的id后,我们来看看他里面的哪个线程占的最高
用top Hp pid 展示某个进程下的所有线程
第四步:查看定位线程下的哪个代码会引发这个问题
我们可以找到占用cpu比较高的线程id 18537
下面我们来用jstack工具:这个工具可以打印出java里的线程的堆栈信息,但是jstack出的日志,线程id是16进制的,因此要先将线程id 转化为16进制
printf "%x\n" 线程id :printf "%x\n" 18537
第5步:执行jstack 打印该线程的堆栈信息
jstack -l 进程的pid | grep 线程16进制pid -A 10 :意思是打印进程中,XX线程的堆栈信息,显示后十行
jstack -l 11938 | grep 4869 -A 10
红框中就是出问题代码的位置:这个地方是个死循环
二、第二种方式:用一个工具show-busy-java-threads,这个工具对jstack做了一层封装
1、下载方式:wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
2、执行方式很简单:./show-busy-java-threads
我们同样能定位到这行代码