CPU占用过高定位

Catalogue
  1. 1. 方法1
    1. 1.1. 找到CPU占用过高的线程
    2. 1.2. 查看Java堆栈
      1. 1.2.1. 找到对应的线程id
      2. 1.2.2. 找不到对应的线程id
        1. 1.2.2.1. 虚拟机自身代码导致的
        2. 1.2.2.2. 重新创建了线程来执行
  2. 2. 方法2

方法1

找到CPU占用过高的线程

top -p <pid>

输入H查看该进程的所有线程的统计情况,从而找到CPU占用过高的线程;

将线程id转化为16进制就是Java堆栈中对应的nid

查看Java堆栈

获取Java堆栈

在线程堆栈中找到nid=上一步nid的线程堆栈

找到对应的线程id

  • 如果该线程正在执行Java代码,说明是该Java代码导致的CPU高

  • 如果线程在执行native code,说明是本地代码导致的CPU高。通过pstack pid获取本地线程堆栈,在本地线程堆栈中找到对应线程,借助本地线程堆栈进行定位。

找不到对应的线程id

有两种可能

虚拟机自身代码导致的

如堆内存枯竭导致的频繁Full GC,或者虚拟机的bug。此时可以通过本地线程堆栈进行定位。

重新创建了线程来执行

方法2

多次打印线程堆栈,找到相同的代码段