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虚拟机》第二版 周志明著,仅作为学习记录,书籍中用到的案例代码及描述有部分修改,但未改变原意。