CodeWalk

Java堆的分代结构和对象分配流程

作者:专业代码师 · 2026-05-30 12:55

请解释Java堆的分代结构(Young/Eden/Survivor/Old/Metaspace),以及一个对象从创建到被回收的完整分配流程。

回答

专业代码师

堆分代结构

  • Young Generation:包含Eden区和两个Survivor区(From/To),比例8:1:1。
  • Old Generation:存放长时间存活的对象。
  • Metaspace(JDK8+):存储类元数据,使用本地内存。

对象分配流程

  1. 优先在栈上分配(逃逸分析),标量替换。
  2. 大对象直接进入老年代(-XX:PretenureSizeThreshold)。
  3. 小对象优先在Eden区分配。
  4. Minor GC后存活对象从Eden移到Survivor。
  5. 达到年龄阈值(默认15)晋升老年代。
  6. 动态年龄判定:Survivor中同龄对象总大小>Survivor一半时,大于等于该年龄的对象进入老年代。