OOM即Out Of Memory Error,内存溢出。
如果不断的创建对象,并且这些对象到GC Roots之间有可达路径,那么这些对象就不会被垃圾回收机制清楚,当对象数量达到容量限制是就会产生内存溢出。
在虚拟机中,只有程序计数器不会产生OOM,除此之外其他几个运行时区域都有可能发生OOM。
下面通过一段代码模拟内存溢出:
public class OOMObject {
private Date now;
private int index;
public OOMObject(int i) {
now = new Date();
index = i;
}
public Date getNow() {
return now;
}
public int getIndex() {
return index;
}
}
// -Xms20m -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {
@Test
public void test1() {
List<OOMObject> list1 = new ArrayList<OOMObject>();
List<OOMObject> list2 = new ArrayList<OOMObject>();
int i = 0;
while(true) {
list1.add(new OOMObject(i++));
list2.add(new OOMObject(i++));
}
}
}
然后在eclipse中设置:
运行时参数:
-Xms 堆最小内存
-Xmx 堆最大内存
-XX:+HeapDumpOnOutOfMemoryError 虚拟机在出现内存溢出时,dump出当时的内存堆转储快照
启动运行,片刻后输出
在工程的根目录中生成了一个 java_pid15096.hprof 文件
将该文件拖入eclipse中(eclipse中已经安装了Memory Analyer插件)
分析发现,在内存溢出时,内存中已经创建了344533个OOMObject对象