Java线上cpu占用过高的排查方法

Java线上cpu占用过高的排查方法


分析:

cpu占用过高的可能原因:

频繁 gc
死循环、线程阻塞、io wait…等等


解决方案(一共三种):

方法1:

1.执行命令 top ,查看所有进程占系统CPU的排序,定位进程的PID – 进程号:
在这里插入图片描述
2.执行命令top -Hp PID,PID为刚才拿到的PID进程号, 定位使用 CPU 最高的线程:
在这里插入图片描述 3.执行命令:printf “%x\n” PID ,将线程 PID 转化为 16 进制为tid:

> printf '0x%x' 12817
> 0x3211

4.执行命令 jstack PID | grep tid 找到线程堆栈,打印前后30行:

> jstack 12816 | grep 0x3211 -A 30

在这里插入图片描述即可定位到 CpuReaper.java 这个类的第25行可能存在问题!


方法2:

命令 show-busy-java-threads的使用

这个脚本来自于github上一个开源项目,项目提供了很多有用的脚本,show-busy-java-threads就是其中的一个。使用这个脚本,可以直接简化方法1中的繁琐步骤,直接打印出问题所在。如下,

linux上直接按顺序执行以下命令:

第一步:

    > wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads 

第二步:

    > chmod +x show-busy-java-threads

第三步:

    > ./show-busy-java-threads

结果:
在这里插入图片描述
show-busy-java-threads说明:

1.从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈

2.缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便

3.当然你可以手动指定要分析的Java进程Id,以保证只会显示你关心的那个Java进程的信息:

show-busy-java-threads -p <指定的Java进程Id>

show-busy-java-threads -c <要显示的线程栈数>


方法3:

arthas thread的使用

阿里开源的 arthas 现在已经几乎包揽了我们线上排查问题的工作,提供了一个很完整的工具集。在这个场景中,也只需要一个thread -n命令即可。

第一步:下载arthas

 > curl -O https://arthas.gitee.io/arthas-boot.jar

下载完成后,当前路径就会有新增这个jar文件:
在这里插入图片描述

第二步:启动

>java -jar arthas-boot.jar

在这里插入图片描述
说明:看到success字眼,证明启动成功;

第三步:执行arthas 命令:

>thread -n 5

在这里插入图片描述

要注意的是,arthas的cpu占比,和前面两种cpu占比统计方式不同。前面两种针对的是Java进程启动开始到现在的cpu占比情况,arthas这种是一段采样间隔内,当前JVM里各个线程所占用的cpu时间占总cpu时间的百分比。

具体见官网:https://alibaba.github.io/arthas/thread.html








参考自:http://hccm.rongsoft.com/article/2020/09/291429471141/

猜你喜欢

转载自blog.csdn.net/weixin_44958006/article/details/121081659