Java堆用于存放对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量到达最大堆的容量限制后产生内存溢出异常。
例:
我们手动限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数均设置为20M)。设置方法:eclispe中window->preferences->Java->Installed JRE,点击右侧的Edit 按钮,在编辑界面中的“Default VM Arguments ”选项中,填入:-Xms20m -Xmx20m
package jvm;
import java.util.ArrayList;
import java.util.List;
/**
* -Xms20m -Xmx20m
*
* @author Poison
*
*/
public class HeapOOM {
static class OOMObject {
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<HeapOOM.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:242)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
at java.util.ArrayList.add(ArrayList.java:440)
at jvm.HeapOOM$OOMObject.main(HeapOOM.java:11)