定位 cpu 飙升问题实操(java 程序)

 

核心步骤

  1. 定位吃 cpu 的进程。
  2. 找到该进程下吃 cpu 的线程。
  3. jstack 工具进行线程分析。
  4. jmap 工具进行内存分析。

使用代码

class Test {
  public static void main(String[] args) {
    int i = 1;
    while (true) {
      i = i * i * i;
    }
  }
}

mac 操作

定位进程

输入 top 命令后会默认按使用率进行排序,很明显可以找到我们的 pid:83133。 image.png

如果排序不是按照 cpu 来的,可以在此界面按下输入 “?” 弹出帮助,帮助上明确提示了可以使用 o+cpu 来选择主排序。 image.png

定位线程

由于 macOS 内核的原因,无法在系统层面直接找到该进程下 cpu 线程,所以直接使用 jstack 人肉分析。
输入 jstack 83133 后: image.png
image.png
可以很”清晰”的肉眼看到第一个线程使用的 cpu=1595966.26ms 非常多,就比较明确了。
可以直接定位到下面的代码位置了:ExposedConsumer.main(ExposedConsumer.java:62)。

如有必要进行分析内存

输入 jmap -dump:format=b,file=dump 83133 后会生成一个 dump 文件: image.png
使用 visualVM 工具 打开文件后: image.png
比较清晰的能看到内存情况了