基于mat做简单的堆内存溢出分析

下载启动mat

首先我们需要下载启动mat

  1. 下载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,这里问题大致就是因为大表查询没有加条件导致的,定位到问题后就很容易解决了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值