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.该篇就到这。

猜你喜欢

转载自blog.csdn.net/qq_35387940/article/details/132493951