排查三板斧
一、top命令定位占用高CPU的进程
执行top命令,可以看到占用CPU高的进程,PID的为41843进程内存过高
如果只想查看指定进程的内存、CPU、负载情况可以用一下命令
top -p 41843
-P 表示查找指定进程
二、top定位指定进程41843里各个线程的执行情况
top -p 41843 -H
-H 表示查看线程情况
此时看到 pid 为41892的线程CPU占用比较高
三、jstack定位问题代码
首先要把线程PID转换成nid
printf 0x%x 41892
0xa3a4roo
其中0x%x的0x是固定字符串,%x是printf的十六进制的转换类型
然后使用jstack
jstack 41892 | grep a3a4
输出
"Thread" prio=10 tid=0x00007f950043e000 nid=0x54ee in test();
可以分析得到: 线程Thread下的wait()函数cpu使用率很高,然后就可以查看源代码中的test()函数:
附录
对top出来的各行的参数解读
第一行是任务队列信息
top - 14:06:34 up 537 days, 6 min, 6 users, load average: 0.41, 0.45, 0.43
2)第二行为进程的信息
第三行为cpu信息
第四、五行为内存信息。
内容如下:
参考文章
https://www.jianshu.com/p/6d573e42310a
https://www.cxyzjd.com/article/hanchao5272/100702388