-
MAT 简介
MAT全称为 Eclipse Memory Analyzer Tool ,eclipse基金会开源的java堆内存分析工具,可以快速的进行堆内存分析、大对象可视化、类加载器分析、线程分析等。在我们碰到线上内存问题时候,是不可多得的好工具(当然也有arthas等国产的好工具 XD)
-
安装
建议下载独立安装版
-
进入mat的下载页面
https://eclipse.dev/mat/downloads.php
-
下载后解压即可
-
-
手把手案例
-
-
创建一个项目,新建测试类
/** * ===================================================================================== * * @Created : 2023/9/10 14:42 * @Compiler : jdk 17 * @Author : VINO * @Copyright : VINO * @Decription : * ===================================================================================== */ public class Product { private String name; private String brand; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } }
main方法测试类
/** * ===================================================================================== * * @Created : 2023/9/10 14:41 * @Compiler : jdk 17 * @Author : VINO * @Copyright : VINO * @Decription : 测试启动类 * ===================================================================================== */ public class MockMemExample { /** * 模拟无限增长的内存 * @param args */ public static void main(String[] args) { List<Product> products=new ArrayList<>(); while(true){ Product product= new Product(); product.setBrand("a"); product.setName("b"); products.add(product); } } }
添加jvm参数
-Xms24m -Xmx24m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapdump.hprof
-
jvm参数介绍
-
-Xms24m
堆内存最小为24M
-
-Xmx24m
堆内存最大为24M
-
-XX:+HeapDumpOnOutOfMemoryError
内存溢出时候自动生成堆内存快照文件,其中**-XX** 表示该参数是非Stable的参数 -
-XX:HeapDumpPath=D:heapdump.hprof
指定堆内存快照文件生成位置
-
-
-
进行测试
-
当运行MockExample的测试方法时,报出 Java heap space OOM错误
-
这表示,列表存储的对象大小超了堆内存设置,众所周知,对象和数组是使用的堆内存。
-去看相应的堆内存快照文件,也生成了。
-
打开MAT,将快照文件导入到MAT中,File->Open Heap Dump…
选择 Leak Suspect Report -
注意这里的 Retained size 和 Shallow Size-
Retained size
当对象被GC后能够释放的所有内存大小,从图上可以看到 可释放内存为14.4MB
-
Shallow Size对象自身所占用的内存大小
对象自身所占用的内存大小
-
-
点击Histogram 可以看到每个类的实例数量及占用内存大小
-
可以看到Product类的内存占用比最高
右击 Product这个类,点选 List Objects 可以看到有income和outcome 两个下拉选项
ListObjects 可以查看对象的引用关系
其中
-
with outgoing references
本对象引用了哪些外部对象
-
with incoming references
查看该对象被哪些外部对象引用了
Leak Suspect Report 报表则提供了 最大可能导致内存溢出的原因
可以看到是一个List容器装载的问题
点击 stacktrace可以看到堆栈信息
MAT的使用介绍就到这里了。
SpringBoot Learning系列 是笔者总结整理的一个SpringBoot学习集合。可以说算是一个SpringBoot学习的大集合。欢迎Star关注。谢谢观看。
关注公众号不迷路