Java服务运行时CPU飙升问题排查

一、前言

  服务器上某个服务CPU异常告警,CPU使用率飙升到几十百分百,甚至达到百分之几百。

二、排查步骤

1、top命令查看进程

  执行:top -c ,显示进程运行信息列表。然后键入P (大写p),进程按照CPU使用率排序。找到CPU消耗最高的进程,记录进程的id(PID)。
Java服务运行时CPU飙升问题排查

2、找到进程中消耗最高的线程

  执行:top -HP 进程id 命令,查看java进程下的所有线程占CPU的情况。记录CPU消耗最高的线程id(PID)。

3、线程PID转为十六进制

  将十进制的线程PID转为十六进制的数值,方法有多种。这里介绍2种:
  1)printf命令
  在服务器上执行: printf “%x\n” 线程PID,可得到对应数字的十六进制。
Java服务运行时CPU飙升问题排查
  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.csdn.net/u011277123/article/details/101673372