三步排查JVM cpu 100%问题
@
目录
本文将通过一个简单的案例,展示几下几点:
如何定位是哪个服务进程导致CPU过载
哪个线程导致CPU过载
哪段代码导致CPU过载
首先是写一个死循环的代码demo,用于模拟cpu100%的场景(此处不一定达到100%,只是为了演示排查过程尽量模拟)
public class BusyCpu { public static void main(String[] args) { new Thread() { @Override public void run() { int result = 0; while (true) { result++; if (result > Integer.MAX_VALUE / 2) { result = 0; } System.out.println(result); } } }.start(); } }
详细步骤
1. 定位哪个服务导致的cpu满载
方法:
- 执行
top -c
,显示进程运行信息列表 - 键入
P (大写p)
,进程按照CPU使用率排序
2. 定位哪个线程导致的cpu满载
上面已经找到最耗cpu的进程,在此基础上,可以寻找耗cpu的线程
方法:
top -Hp 187968
,显示指定进程的线程运行信息列表- 键入
P (大写p)
,线程按照CPU使用率排序
从上图看出,进程187968中最耗cpu的线程是187990
3. 查看堆栈,定位到具体代码段
上面已经找到具体的线程,接下来可以通过在堆栈信息中,查看具体的代码段和相关信息。
首先:
上面线程号是10进制,在堆栈信息中,线程号是16进制,因此可以先通过命令转换为16进制
> printf "%x\n" 187990 2de56
其次方法:
找到进程中的堆栈信息,然后按照线程号查找相关信息
- 打印进程堆栈
- 通过线程id(16进制),过滤得到线程堆栈
> jstack 187968 > temp.stack
相关推荐
coolrainman 2020-07-28
zhouxihua0 2020-07-27
liufangbaishi0 2020-07-18
ChenRuiyz 2020-07-18
nbfcome 2020-07-04
jvm 2020-07-04
nbfcome 2020-06-26
瓜牛呱呱 2020-11-12
starinshy 2020-11-10
farewellpoem 2020-11-09
Charlesbases 2020-10-23
arctan0 2020-10-14
hackerlpy 2020-09-25
温攀峰 2020-09-16
天空一样的蔚蓝 2020-09-04
ericxieforever 2020-09-03
cyhgogogo 2020-08-18
大唐帝国前营 2020-08-18
yuanlu 2020-08-17