JAVA堆溢出

前言:

看到学校课程q群里面有个同学说遇到oom问题怎么办,然后有一个同学给出了分析dump文件,这让我回想当时看深入理解jvm这本书的时候也看到了相关的例子,不过当时没有跟着操作下去。现在来补一补

实现内存泄漏导致java堆溢出

配置vm参数

JAVA堆溢出_第1张图片
-Xms20m 堆的最小值
-Xmx20m 堆的最大值 避免堆自动扩展
-XX:+HeapDumpOnOutOfMemoryError 发生堆溢出的时候生成dump文件以便与后面分析

java代码:

// vm args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {
    static class OOMobject{

    }
//    Java heap space java堆空间
    public static void main(String[] args) {
        List<OOMobject> list=new ArrayList<OOMobject>();
        while (true){
            list.add(new OOMobject());
        }
    }
}

结果

JAVA堆溢出_第2张图片
上方代码不断生成oomObject对象,通过一个list保持对于这些对象的引用,而list这个集合对象是虚拟机栈中帧栈的一个引用对象(gc roots),所以这些oomobject对象在堆内存满,无法再分配对象的时候发起的minor gc和full gc中不会被清除,到时堆无足够空间,到时堆溢出。

使用jprofiler来分析dump文件

配置了-XX:+HeapDumpOnOutOfMemoryError 会在堆溢出的时候自动生成dump文件,在项目的目录下,不过idea貌似不会显示,害我找了挺久的。
随后找了找网上如何分析,发现都是用eclipse的一个插件分析,我用的是idea所以也没有搞了,不过找到了一个蛮不错的jprofiler。
直接用jprofiler打开dump文件
JAVA堆溢出_第3张图片
简单明确,直接指出占用过多空间的对象的类型。

总结

这只是一个小小的实验来模拟堆溢出的情景,相当于回顾了一下jvm的垃圾收集吧。附上一些常用参数https://blog.csdn.net/denggouya9281/article/details/101223948

你可能感兴趣的:(jvm)