Java服务运行时CPU飙升问题排查
一、前言
服务器上某个服务CPU异常告警,CPU使用率飙升到几十百分百,甚至达到百分之几百。
二、排查步骤
1、top命令查看进程
执行:top -c ,显示进程运行信息列表。然后键入P (大写p),进程按照CPU使用率排序。找到CPU消耗最高的进程,记录进程的id(PID)。
2、找到进程中消耗最高的线程
执行:top -HP 进程id 命令,查看java进程下的所有线程占CPU的情况。记录CPU消耗最高的线程id(PID)。
3、线程PID转为十六进制
将十进制的线程PID转为十六进制的数值,方法有多种。这里介绍2种:
1)printf命令
在服务器上执行: printf “%x\n” 线程PID,可得到对应数字的十六进制。
2)计算器
4、查看线程在干嘛
使用jstack工具执行:jstack 进程ID | grep 线程ID(十六进制),查看线程的堆栈信息。然后根据堆栈信息查看对应代码即可。
5、进一步分析
第4步骤中,如果打印出的线程带有"VM Thread",说明是GC线程。此时有可能是频繁服务GC操作导致。
1)jmap查看内存使用情况
执行: -heap 进程ID,在线查看各年代内存使用情况
2)导出dump日志
执行:jmap -dump:format=b,file=filename 进程ID,下载到本地,通过IDE可以打开,分析各类型对象创建情况。
参考文献
1、https://mp.weixin.qq.com/s/YGW7eJZVEHJaJqOlK3gMUg
2、https://blog.****.net/u011277123/article/details/101673372