深入理解Java虚拟机-OOM分析

 2019-12-22 10:44  阅读(951)
文章分类:JVM

OOM即Out Of Memory Error,内存溢出。

如果不断的创建对象,并且这些对象到GC Roots之间有可达路径,那么这些对象就不会被垃圾回收机制清楚,当对象数量达到容量限制是就会产生内存溢出。

在虚拟机中,只有程序计数器不会产生OOM,除此之外其他几个运行时区域都有可能发生OOM。

下面通过一段代码模拟内存溢出:

public class OOMObject {
        private Date now;
        private int index;
        public OOMObject(int i) {
            now = new Date();
            index = i;
        }
        public Date getNow() {
            return now;
        }
        public int getIndex() {
            return index;
        }
    }

// -Xms20m -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
    public class HeapOOM {

        @Test
        public void test1() {
            List<OOMObject> list1 = new ArrayList<OOMObject>();
            List<OOMObject> list2 = new ArrayList<OOMObject>();
            int i = 0;
            while(true) {
                list1.add(new OOMObject(i++));
                list2.add(new OOMObject(i++));
            }
        }
    }

然后在eclipse中设置:

2019120001251\_1.png

运行时参数:

-Xms 堆最小内存

-Xmx 堆最大内存

-XX:+HeapDumpOnOutOfMemoryError 虚拟机在出现内存溢出时,dump出当时的内存堆转储快照

启动运行,片刻后输出

2019120001251\_2.png

在工程的根目录中生成了一个 java_pid15096.hprof 文件

将该文件拖入eclipse中(eclipse中已经安装了Memory Analyer插件)

分析发现,在内存溢出时,内存中已经创建了344533个OOMObject对象

2019120001251\_3.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 深入理解Java虚拟机-OOM分析

相关推荐