cpu飙升居高不下,这种事情虽然很少,可能在一家公司待一年也不会发生一次。

但是这种故障一旦发生了,可能就很严重。

那么当我们某个Java项目占比很高了,怎么定位到代码?

一、top

看一下大概情况,看看谁占的最高,会显示每个进程和具体的cpu占比,我这里显示的是正常情况,特殊情况下,cpu可能飙升到100%,200%

java进程消耗大量内存 java进程cpu高的原因_飙升

如果你想知道这个进程对应的应用信息,可以

ps -17464

这个命令可以显示进程对应的服务名,jar包,路径,还有内存配置等信息。

二、假如现在上面pid为17464的进程占的很高,达到了200%了。这时候,我们要看一下这个进程的线程情况。因为进程cpu过高,还是因为它里面的线程cpu过高。这里面可能是由一个线程导致,也有可能由多个线程共同导致的。比如说,一个进程总的cpu达到200%了,可能是由三个子线程分别占用60%多的比例。

top -p 17464 -H

-H表示看线程信息,注意这里虽然列名还是"pid",但实际上已经是表示线程的id,就是17464这个进程下所有的线程信息,cpu占比也在其列。

 

z

java进程消耗大量内存 java进程cpu高的原因_cpu_02

三、假如就是上面17614的线程占用了绝大部分cpu,虽然实际上可能有多个线程同时是高占用内存,我们这里假设就它一个。找到这个线程之后,就是要看它的堆栈信息,这是寻找问题根源的关键。

首先将转换成线程id转成16进制,得到44ce

[root@VM-0-15-centos ~]# printf "%x\n" 17614
44ce

四、查看该进程下该线程的堆栈信息。

1、先将堆栈信息写入到文件中

jstack 17464> thread_stack.log

2、然后在文件中查找根据线程0x44ce去找日志就可以了

备注:一般情况我们会执行jstack 17464 | grep 44ce去查看堆栈信息,但是有时候会报错,提示:

18626: Unable to open socket file: target process not responding or HotSpot VM not loaded

具体原因后面再看