jvm新生代采用复制算法实现高效回收:98%对象短命,仅1%~2%需复制;eden与survivor按8:1:1划分,可用内存达90%;一次复制完成清理、整理与分配准备;年龄机制避免无效搬运,超阈值对象直接晋升老年代。

JVM 在新生代用复制算法实现高效回收,核心不是靠“蛮力搬数据”,而是把算法和对象行为特征深度绑定,再配合精巧的内存划分与执行节奏。
新生代对象天生适合复制
98% 的新创建对象存活时间极短,一次 Minor GC 就能回收掉绝大部分。这意味着每次扫描时,真正要复制的对象极少——可能只有 1%~2%。复制算法只遍历存活对象,不碰垃圾,天然避开大量无效工作。
Eden + Survivor 三区结构压低空间浪费
JVM 不用传统对半分的 From/To 区,而是把新生代按 8:1:1 划为 Eden、S0、S1。
- 新对象全部分配在 Eden 区(占 80%)
- GC 触发时,只扫描 Eden 和一个 Survivor(比如 S0),把其中存活对象复制到另一个空闲 Survivor(S1)
- 复制完成后,Eden 和 S0 直接清空,S1 成为新的“承载区”,S0 变为空闲
这样实际可用内存达新生代总量的 90%,远高于朴素复制算法的 50%。
一次复制完成清理+整理+分配准备
复制过程本身隐含三重收益:
- 存活对象被集中搬到一块连续区域,彻底消除碎片
- 原 Eden 和 From 区无需逐个擦除,只需重置指针(Bump-the-pointer),分配新对象快如飞
- 引用更新在复制时同步完成,栈帧和老年代中的引用会一并修正,保证对象图一致性
年龄机制避免无效搬运
每个对象在 Survivor 区每熬过一次 GC,年龄 +1;达到阈值(默认 15)就直接晋升老年代。这防止了长生命周期对象反复在两个 Survivor 间来回拷贝,也减轻了复制负担。如果某次 GC 后 To 区装不下,剩余存活对象直接进老年代,不卡住流程。
基本上就这些。











