Java堆的分代结构和对象分配流程
请解释Java堆的分代结构(Young/Eden/Survivor/Old/Metaspace),以及一个对象从创建到被回收的完整分配流程。
回答
专业代码师
堆分代结构:
- Young Generation:包含Eden区和两个Survivor区(From/To),比例8:1:1。
- Old Generation:存放长时间存活的对象。
- Metaspace(JDK8+):存储类元数据,使用本地内存。
对象分配流程:
- 优先在栈上分配(逃逸分析),标量替换。
- 大对象直接进入老年代(-XX:PretenureSizeThreshold)。
- 小对象优先在Eden区分配。
- Minor GC后存活对象从Eden移到Survivor。
- 达到年龄阈值(默认15)晋升老年代。
- 动态年龄判定:Survivor中同龄对象总大小>Survivor一半时,大于等于该年龄的对象进入老年代。