Java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,就会在对象数量到达最大堆的容量限制后产生内存溢出异常。
代码清单中限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便时候进行分析。
在Eclipse中的Run Configurations页签中设置虚拟机参数如下图所示:
代码如下:
package oom; import java.util.ArrayList; import java.util.List; /** * JAVA堆溢出 * @author Madison * @date 2014-7-11 * VM Args: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError */ 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()); } }
运行结果:
java.lang.OutOfMemoryError:Java Heap space
Dumping Heap to java_pid3404.hprof...
Heap dump file created[22045981 bytes in 0.663 secs]
JVM【第五回】:【OutOfMemoryError异常之Java堆溢出】
时间: 2024-10-11 05:10:26