排查步骤
Step 1 : 找到占用 CPU 最高的 Java 进程
使用 top 命令找到CPU占用高的Java进程,可以看到进程的PID
Step 2 : 找到进程内占用 CPU 最高的线程
执行 下面的命令,找到占用 CPU 最高的那个线程 PID
top -Hp [进程PID]
或者
Ps -mp [进程PID] -o THREAD,tid,time
找到CPU占用率高的tid(线程ID)
Step 3 : 保持线程栈信息
当前 Java 程序的所有线程信息都可以通过 jstack命令查看,我们用jstack命令将第一步找到的 Java 进程的线程栈保存下来。
jstack [进程PID] > thread_stack.log
Step 4 : 在线程栈中查找最贵祸首的线程
第二步已经找到了这个罪魁祸首的线程 PID/TID,并把它转换成了 16 进制的,第三步保存下来的线程栈中有所有线程 ID 的16 进制信息,我们在线程栈中查找这个16进制的线程 id
最后, 线程名称、线程状态、以及哪行代码消耗了最多的 CPU 都很清楚了。
