MAT使用指南

1,888 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

Memory Analyzer (MAT)

The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.

安装

官网地址:www.eclipse.org/mat/

image.png

目前MAT已经迭代到了1.12.0版本, 已经支持解析OpenJDK 15的堆信息。

需要注意的是,MAT本身也是java应用,运行所需的最低java版本已经是Jdk 11了。

配置

image.png

解压之后,根据自己的电脑配置和堆转储文件的大小,酌情改一下MemoryAnalyzer.ini中的Xmx的大小。

image.png

获取堆转储文件

介绍几种方式:

  1. 从服务器上直接dump,一般是联系运维同学帮忙操作,传到本地进行分析。
jmap -dump:format=b,file={dumpfile.hprof} {pid}


举例:jmap -dump:format=b,file=20210823.hprof 55244
  1. 还可以配置在启动参数上,当发生内存溢出时,会自动dump文件。
-XX:+HeapDumpOnOutOfMemoryError
  1. 通过VisualVM,这里建议下载一个idea插件:

image.png

插件安装好之后,可以在debug按钮后面找到新增的两个橘色按钮,和正常的run、debug相比,会在启动的同时打开 Java visualVM。

image.png

切换到监视页签,可以点击图示位置的按钮,进行dump操作。

image.png

加载文件

image.png

这里面最常用的功能就是Histogram、Leak Suspects。

先贴一下代码:

@Controller
public class HelloWorldController {

    @GetMapping("index")
    public void index() throws InterruptedException {
        hi();
    }

    public void hi() throws InterruptedException {
        int size = 1024 * 1024;

        List<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            System.out.println("存放了" + (i + 1) + "M 数据");
            list.add(new byte[size]);
            Thread.sleep(1000);
        }
    }
}

Leak Suspects:

image.png

image.png

图中黄色部分是问题描述,一个tomcat任务线程保存了33M的本地变量,Keywords里面甚至给出了具体的类名和行数。

点进详情,还可以查看完整的堆栈信息

image.png

Histogram

image.png

image.png

image.png

上面三个步骤,意思是查看排除虚引用/弱引用/软引用等的引用链,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个对象否还存在Strong 引用链(在导出HeapDump之前要手动出发GC来保证),如果有,则说明存在内存泄漏,然后再去排查具体引用。

可以清楚的看到List里面,33个byte数组,每个占用1M内存。

好了,今天就先介绍到这里,我们下期再见👋🏻。