下载启动mat
首先我们需要下载启动mat
- 下载mat
官网下载地址
这里更加自己的系统选择合适的压缩包
我选择的是Windows(x86),下载之后是个zip包,解压就直接可以使用
如果分析的dump文件过大需要调整 在 MemoryAnalyzer.ini配置文件中修改 mat的启动参数
修改 xmx的启动堆内存即可
生成 dump文件
这里我们简单的生成一份dump文件
运行如下的程序
public static void main(String[] args) {
long count = 0;
List<Object> list = new ArrayList<>();
while (true) {
list.add(new Object());
System.out.println("当前创建了第" + (++count) + "个对象");
}
}
jvm启动参数:
-Xms10m
-Xmx10m
-Xss512k
-Dfile.encoding=UTF-8
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-Xloggc:./logs/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./logs/heapdump.hprof
运行完后在logs生成 heapdump.hprof
加载dump文件
点击File–>Open Heap Dump,选择dump文件,MAT会加载并分析该dump文件,如果文件较大,可能需要一些时间。
这里可以看到给我们分析的原因就是 内存都被一个实例对象占用了,就是java.lang.Object[]
我们查看详细的执行栈
可以明显看出异常代码位置
生产真实案例
来看看我们生成一个 真实的 heapdump.hprof 分析堆内存
这里通过完成的堆栈异常分析可以很清楚的定位到问题代码,可以明显的看出就是数据库查询数据量过大导致的OOM,这里问题大致就是因为大表查询没有加条件导致的,定位到问题后就很容易解决了