阿里Java诊断工具 arthas - 排查线上环境内存使用过大线程cpu使用率高问题

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里Java诊断工具 arthas - 排查线上环境内存使用过大线程cpu使用率高问题相关的知识,希望对你有一定的参考价值。

一、arthas

上篇文章对arthas的安装以及指令做了展示,可以感觉出arthas提供的指令还是挺多的,上篇文章没有对指令进行过多的演示,目的是大家在学习arthas后,就可以在上篇文章或者官方文档中统一查找定位使用哪个指令了,本篇文章借助arthas排查应用内存使用过大、线程cpu使用率高问题,可以加深大家对arthas指令的理解。

下面是上篇文章的地址:

https://blog.csdn.net/qq_43692950/article/details/122686329

二、排查应用内存使用过大、或者内存溢出问题

构建问题环境

在开始前我们先准备测试的应用,这里可以新建一个SpringBoot项目,在项目中我们故意写一个占用内存的BUG:

@RestController
public class JvmThreadController 
    List<byte[]> memoryList = new ArrayList<>();
    
    @GetMapping("/memoryTest")
    public String memoryTest(int c) 
        byte[] b = new byte[c * 1024 * 1024];
        memoryList.add(b);
        return "success";
    

上面我们创建了一个controller,声明了一个byte[]类型的 memoryList 列表,并在memoryTest接口中对memoryList每次以 c兆的大小进行塞值,由于memoryList是全局变量,并不会被GC回收所以,以此我们就可以达到内存占用量大的目的了。

在启动时,我们最好也指定下JVM的参数,将最大堆内容设为50M,这样就可以很快出现OOM的问题了,并且我们也可以打印出内存溢出时的hprof文件:

java -Xmx50m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/ -jar demo.jar 

下面多调用几次memoryTest接口:

已经出现问题,下面我们开始排除问题

排查问题

使用arthas连接到该应用,先使用dashboard查看下当前内存使用情况:

可以看到堆的使用率,以及老年代的使用率都接近满的状态了,如果我们应用没有大的对象,那就是肯定某个对象站用了大量的空间。

使用arthas生成内存分区的火焰图:

 profiler start --event alloc

等待一会,获取已采集的sample的数量

profiler getSamples

停止采集,并生成html文件,后面时文件存放的地址

profiler stop --format html --file /java/output.html

将output.html文件从生产环境导出到本地,用浏览器打开:

可以看到是一个调用链,下面就要看每个链的末尾,具体时哪个地方占用的内存:


从上面应该可以得到问题所在,是在com/bxc/arthasdemo/controller/JvmThreadController.memoryTest方法,并且和byte[]有关,还和java.util.ArrayDeque有关,查看这个地方的代码,应该不难看出问题了。

下面还可以使用heapdump将此时的hprof快照文件导出,使用MAT工具再进行分析,是不是还是将问题定位到上面的地方:

生成hprof快照:

heapdump /java/heapdump.hprof

heapdump.hprof文件导出使用MAT打开,并查看Leak Suspects


可以看到给出了两个问题:

查看第一个问题的详情:

看到这个地方也是比较明确了问题所在。

三、排查线程cpu使用率高问题

未完待续

以上是关于阿里Java诊断工具 arthas - 排查线上环境内存使用过大线程cpu使用率高问题的主要内容,如果未能解决你的问题,请参考以下文章

阿里Java诊断工具 arthas - 生产环境反编译动态修改程序调试应用

Java在线诊断利器之Arthas

java生产环境调试问题排查神器arthas(阿里中台开源的)

阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了!

Java 诊断工具 Arthas-基本概念和常见命令

阿里人都在使用的在线诊断工具—Arthas