通过代码模拟Java虚拟机规范中描述的各个运行时区域内存溢出的场景。
1. Java堆溢出
首先,虚拟机启动参数配置如下:
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
其中,-verbose:gc
表示输出虚拟机中GC的详细情况。-Xms20M -Xmx20M
最小堆内存20M,最大堆内存20M。-Xmn10M
设置新生代的容量10M。-XX:+PrintGCDetails
打印GC详细信息,-XX:SurvivorRatio=8
年轻代中Eden区与Survivor区的大小比值。
import java.util.ArrayList;
import java.util.List;
/**
*
*
* VM Args:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
* @author 作者 zhuyiquan90
* @created 2017-9-1 上午11:46:34
* @version 1.0.0
* @date 2017-9-1 上午11:46:34
*/
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}
输出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2245)
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:213)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
at java.util.ArrayList.add(ArrayList.java:411)
at HeapOOM.main(HeapOOM.java:15)
Heap
def new generation total 9216K, used 8920K [0x32570000, 0x32f70000, 0x32f70000)
eden space 8192K, 100% used [0x32570000, 0x32d70000, 0x32d70000)
from space