问题描述:
cpu占用过高,服务器卡死,问题排查
java进程占用CPU过高常见的两种情况:
代码中有死循环或者接近死循环的操作
快速创建大量临时变量,导致频繁触发gc回收
问题解决:
1、用top命令找到cpu占用率最高的进程号是8958
top
2、top -Hp pid 命令找到该进程下cpu占用最高的线程(shift+p 按cpu排序,shift+m 按内存排序)
top -Hp 8958
3、使用 printf ‘%x\n’ PID (PID为上一步中获取到的线程号)转换成对应的16进制PID 5c7e(为什么要转换,因为用jstack工具导出的信息里面线程对应的nid是16进制的。)
printf '%x\n' PID
4、使用jdk自带的工具jstack来排查问题所在
jstack -l 8958 | grep 5c7e -A 80
【注意:8958是第一步top命令找到的cpu占用最高的进程id,5c7e是该进程下cpu占用率最高的线程id】
[说明:-A 80 是关键字后的80行代码]
5、导出进程出错信息
jstack pid(进程pid)>stack.dump
当前目录下找堆栈文件就鳄鱼i
如果提示jstack命令未找到,则需要跑到jdk安装目录下的bin目录
参考
https://blog.csdn.net/notsaltedfish/article/details/80209538?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task