核心步骤
- 定位吃 cpu 的进程。
- 找到该进程下吃 cpu 的线程。
- jstack 工具进行线程分析。
- jmap 工具进行内存分析。
使用代码
class Test {
public static void main(String[] args) {
int i = 1;
while (true) {
i = i * i * i;
}
}
}
mac 操作
定位进程
输入 top 命令后会默认按使用率进行排序,很明显可以找到我们的 pid:83133。

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

定位线程
由于 macOS 内核的原因,无法在系统层面直接找到该进程下 cpu 线程,所以直接使用 jstack 人肉分析。
输入 jstack 83133 后:


可以很”清晰”的肉眼看到第一个线程使用的 cpu=1595966.26ms 非常多,就比较明确了。
可以直接定位到下面的代码位置了:ExposedConsumer.main(ExposedConsumer.java:62)。
如有必要进行分析内存
输入 jmap -dump:format=b,file=dump 83133 后会生成一个 dump 文件:

使用 visualVM 工具 打开文件后:

比较清晰的能看到内存情况了
NEXTzgc