这里主要是对jstack命令的使用;
程序在运行过程中卡主,前端无法访问,一看服务器CPU占用达到200到300%多。
排查思路
1)找出占用高的进程
2)找出占用高的线程
3)找出具体的代码
分析步骤:
第一步:使用 top 找到占用 CPU 最高的 Java 进程 pid (1966)
第二步:用 top -Hp pid 命令查看占用 CPU 最高的线程
top -Hp 1966
shift+p 按cpu排序,shift+m 按内存排序
就可以获取到这个进程下面所有线程,通过查看%CPU找到最耗费CPU的是线程PID 2912
第三步:用 printf '%x\n' PID 线程id转换成16进制 b60
printf '%x\n' 2912
b60
第四步,使用jstack 获取对应的线程信息
jstack 1966 | grep b60
结果报了一个错误:1966: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
解决方案:
首先检查用户权限,jstack需要使用与进程一致的用户才能执行,即使是root,命令加上sudo
如果是使用了docker来启动,解决方法:需要进入到容器中去执行jstack命令。
jstack 1966 | grep b60 -C4 --color,找到具体的代码
找到前后四行的代码
第五步,用转换的16进制在线程栈的信息里全局搜索,线程名称,线程状态,具体的哪一行代码都可以查到
参考文章: