核心步骤
- 定位吃 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