排查步骤

Step 1 : 找到占用 CPU 最高的 Java 进程

使用 top 命令找到CPU占用高的Java进程,可以看到进程的PID

Step 2 : 找到进程内占用 CPU 最高的线程

执行 下面的命令,找到占用 CPU 最高的那个线程 PID

  1. top -Hp [进程PID]

或者

  1. Ps -mp [进程PID] -o THREAD,tid,time

找到CPU占用率高的tid(线程ID)

Step 3 : 保持线程栈信息

当前 Java 程序的所有线程信息都可以通过 jstack命令查看,我们用jstack命令将第一步找到的 Java 进程的线程栈保存下来。

  1. jstack [进程PID] > thread_stack.log

Step 4 : 在线程栈中查找最贵祸首的线程

第二步已经找到了这个罪魁祸首的线程 PID/TID,并把它转换成了 16 进制的,第三步保存下来的线程栈中有所有线程 ID 的16 进制信息,我们在线程栈中查找这个16进制的线程 id

最后, 线程名称、线程状态、以及哪行代码消耗了最多的 CPU 都很清楚了。