Java 小白也能学会OOM内存溢出问题 排查分析

前言

最近在学习群里面,有聊到近几天排查生产问题上面的OOM事故。

有兄弟私聊问到怎么看。

其实非常简单,但是我想了下是不是有很多人没接触过?或者是望而生畏?

那么,就来做个简单的小教程示例吧。

正文

简单写个User类 :

public class User {
    private Long id;
    private String name;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

然后写个循环一直new User(), 直接制造出OOM:
 

public class TestUtil {



    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        do {
            User user = new User();
            user.setName(UUID.randomUUID().toString());
            userList.add(new User());
        } while (true);
    }

}

执行一下这个测试例子:
 

 很好,OOM看到了 OutOfMemoryError 。

接下来,就是我们简单的分析。 怎么去看OOM。


我们通过heap dump 文件分析问题即可。

怎么整?

两步 :
① 设置 OOM 生成堆转储文件

②用java自带的Java visualVM 分析文件

 我们运行的时候,加上参数   -XX:+HeapDumpOnOutOfMemoryError  


HeapDumpOnOutOfMemoryError 是 Java 虚拟机的一个选项。当发生 OutOfMemoryError(内存溢出错误)时,
设置了该选项后,Java 虚拟机会生成一个堆转储文件(heap dump),用于分析导致内存溢出的原因。

当然还可以顺便指定文件生成的路径 (-XX:HeapDumpPath=<转储文件路径> ),不指定就是默认项目所在的根路径下。


为了方便我们例子操作,我们把运行可用的内存分配小些,这样for循环跑几下就报OOM了。

-Xmx10m 

linux环境可以这样:

java  -Xmx10m  -XX:+HeapDumpOnOutOfMemoryError   -jar xxxx.jar   


我们是本地自己电脑,在idea上设置一下即可:

 

然后重新跑下我们的测试例子:
 

 

OK,第一步完成,接下来就是第二步,分析文件找原因。

先瞧一眼刚才生成的文件:

 然后去打开java自带的分析工具 Java visualVM:


 

打开看到这个样子:

 

然后打开我们需要分析的文件:

 

 

可以看到在概要栏这里,明显告诉我们,有个main方法报了OOM :
 

 

点进去main细看一下:


 

 那么我们再看看 类 这一栏,看看具体咋回事 :
 

ps: 这里的大小单位是 字节

 

 OK,基本能确定问题:

这个main函数里面,无限循环,一直new User ,把内存用炸了(毕竟我们故意设置了10m内测)。

 

OK.该篇就到这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

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

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

打赏作者

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

抵扣说明:

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

余额充值