线上服务 CPU 占用过高怎么排查?

CPU高占用通常是某个程序长时间占用了CPU资源。下面是问题分析的步骤:

1)首先需要找出占用CPU高的进程。

  • 使用top命令列出系统中各个进程的资源占用情况。

2)然后确定占用CPU高的进程中是哪个线程导致的。

  • 使用top -Hp <进程ID> 命令列出该进程中各个线程的资源占用情况。

3)找到相应线程的ID后,打印该线程的堆栈信息。

  • 使用printf "%xn" <线程ID> 将线程ID转换为十六进制格式。
  • 使用jstack <进程ID> 命令打印出进程的所有线程信息,并从中找到上一步转换为十六进制的线程ID所对应的线程信息。

4)根据线程的堆栈信息定位具体的业务方法,从代码逻辑中找出问题所在。

注意观察是否有线程长时间处于等待(waiting)或阻塞(blocked)状态。如果线程长时间处于等待状态,可以关注"waiting on xxxxxx",这表明线程正在等待某个锁。然后根据锁的地址找到持有该锁的线程。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题