[转]当CPU飙高时,它在做什么

时间:2024-10-16 15:35:38

在开发过程中,有时候我们发现 JVM 占用的CPU/内存居高不下,跟我们的预期不符,这时,CPU 在做什么呢?是什么线程让CPU/内存如此忙碌呢?我们通过如下几步,可以查看 CPU 在执行什么线程。

1、top 命令查看CPU/内存占用过高的进程(P 按CPU占用大小排序,M 按内存占用大小排序),并记录下进程的 pid

2、top -Hp pid 查看进程的线程信息(P 按CPU占用大小排序,M 按内存占用大小排序),并记录下线程的 tid

[转]当CPU飙高时,它在做什么

3、将 tid 转换为16进制的数字:printf "%x\n" tid

[转]当CPU飙高时,它在做什么

4、使用 jstack 命令,查询线程信息,从而定位到具体线程和代码:jstack pid | grep 6f8a -A 30

[转]当CPU飙高时,它在做什么

这样,你就看到为什么 CPU/内存 占用这么高,是什么线程在捣乱了!

5、极端点的做法,把进程全部的线程堆栈导出来,然后再定位 tid 线程在做什么:jstack 18023 > /home/wwwroot/dump18023

6、统计线程分别处于什么状态,grep java.lang.Thread.State dump18023 | awk '{print $2$3$4$5}' | sort | uniq -c