OOM排查小案例

本文介绍了如何通过Java参数设置触发并获取OOM错误的dump文件,然后使用Eclipse Memory Analyzer (MAT)工具进行分析。通过MAT,发现了大量Dandan对象导致内存占用过大,进一步追踪发现这些对象与main线程有关联,从而定位到问题代码。文章提供了详细的MAT使用步骤和分析流程,帮助开发者解决类似的内存溢出问题。
摘要由CSDN通过智能技术生成

写作目的

排查过某OOM问题吗?额。。。没有

小案例

程序

import java.util.ArrayList;
import java.util.List;

public class Main {

  public static void main(String[] args) throws Exception {
    List<Dandan> list = new ArrayList<>();
    while (true) {
      list.add(new Dandan());
    }
  }
}

class Dandan {}



获取dump文件

-Xmx1m -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=C:\Users\25682\Desktop\aaa

其中Xmx是设置堆的最大值,HeapDumpOnOutOfMemoryError 设置当出现OOM的时候生成dump文件,HeapDumpPath表示生成的dump文件的位置

在上面的程序中添加这几个参数就会在指定的路径下获取到一个dump文件
在这里插入图片描述

分析dump文件

MAT分析工具的获取

https://blog.csdn.net/weixin_39621669/article/details/110668789
注意:我下载的是1.10.0版本,下载高版本的话可能需要你装更高版本的JDK

分析dump文件

内存占用过大的对象是什么

把dump文件导入到MAT中,如下图所示
在这里插入图片描述
点击finish后进入主页面,如下图所示,可以发现main线程是有问题的
在这里插入图片描述
点击图中菜单的按钮,根据数量排序,找到数量最大的对象,我们发现Dandan对象是可疑的
在这里插入图片描述

这个对象被谁引用

点击下图中菜单栏中的按钮,我们会选择之前怀疑的main线程,选中并且点击
在这里插入图片描述
发现main线程和Dandan对象确实是有联系的,因此可以推断出 发生OOM的对象是被main线程关联的
在这里插入图片描述

定位到具体的代码

点击下图中的按钮,然后就出现了下图中类似线程调用栈的过程,从下往上看,并且后面有执行的代码行数,就可以定位到具体的代码
在这里插入图片描述

参考

https://www.bilibili.com/video/BV1q84y1F7kJ?from=search&seid=1887129671651989294
https://www.cnblogs.com/jiyukai/p/9292348.html
https://blog.csdn.net/yinni11/article/details/82463844

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CBeann

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值