jvm 内存溢出-堆溢出

Java 堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,则在对象数量到达最大堆的容量限制后就会产生内存溢出异常。因此我们用编写如下代码来模拟内存溢出

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

public class HeapOom {
  public static void main(String[] args) {
    List<Object> objectList = new ArrayList<>();
    while (true) {
      objectList.add(new Object());
    }
  }
}

然后使用 javac HeapOom.java 编译,并在运行时限制 java 堆大小为 1m ,另外我们还经常设置 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap-dump-path 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照以便事后进行分析。

运行java -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap-oom.hprof HeapOom这段代码很快就会出现内存溢出:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to heap-oom.hprof ...
Unable to create heap-oom.hprof: File exists
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at HeapOom.main(HeapOom.java:8)

说明

文章摘自《深入理解Java虚拟机》第二版 周志明著,仅作为学习记录,书籍中用到的案例代码及描述有部分修改,但未改变原意。