问题描述
CPU某给进程占用过高,导致服务器卡死,程序假死,问题排查。
产生原因
代码中有死循环或接近死循环的操作。
快速创建大量临时变量,导致频繁触发GC回收。
问题解决
1. 用top命令找到cpu占用率最高的进程号pid
top
2. top -Hp pid 命令找到该进程下cpu占用最高的线程
shift + p 按cpu排序
shift + m 按内存排序
top -Hp pid(进程号)
3. 使用 printf ‘%x\n’ PID (PID为上一步中获取到的线程号)转换成对应的16进制PID
用jstack工具导出的信息里面线程对应的nid是16进制的
printf '%x\n' pid(进程号对应的线程号)
4. 使用jdk自带的工具jstack来排查问题
jstack -l pid(进程号) | grep (进程号对应的16进制线程号)-A 80
PS:pid(进程号)是指第一步top命令找到的cpu占用最高的进程id,
(进程号对应的16进制线程号)是指该进程下cpu占用率最高的线程id
说明:-A 80 是关键字后的80行代码
5. 导出进程错误信息
jstack pid(进程号) > stack_log.dump
说明:如果提示未找到jstack命令,请安装java jdk并配置配置java环境变量。