一 代码分析
/**
* 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 就会工作。
本文通过一个简单的Java代码示例,演示了如何触发堆内存溢出异常,并利用VisualVM工具深入分析了垃圾回收(GC)机制。详细解释了对象在Eden区、Survivor0区、Survivor1区及Old区之间的迁移过程。
2577

被折叠的 条评论
为什么被折叠?



