一 代码分析
/**
* Java 堆内存溢出异常测试
*
* @author Hang W
*/
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) throws Exception {
List<OOMObject> list = new ArrayList<OOMObject>();
while(true) {
Thread.sleep(1);
list.add(new OOMObject());
}
}
}
分析:一直往堆内存里创建新对象
二 VisualVM 工具分析
如图分析:
1. 新生对象会放到 新生代 Eden 区。
2. 当 Eden 区达到80%的时候,会将对象复制到 Survivor0 区。
3. 当 Survivor0 满了就将对象复制到 Survivor1 区。
4. 当对象在 Survivor0 区和 Survivor1 区,最多移动 15次 后,虚拟机会将对象 重新放到 Old 老年代。
5. 所以 Survivor0 区和 Survivor1 区 是交替增长的,Old 老年代 是一直增长的。
6. 当 Eden 区达到 80% 峰值的时候,GC 就会工作。