复制算法不将内存物理对半划分,而是采用eden:s0:s1=8:1:1的非对称三区结构;eden承担80%对象分配,survivor区交替作为from/to区,存活对象复制后清空源区;对象按年龄阈值或动态判定晋升老年代,tlab减少分配竞争与gc频率。

复制算法并不将内存物理对半划分来应对对象晋升,这是一种常见误解。
实际中,JVM新生代采用的是非对称的三区结构(Eden : S0 : S1 = 8 : 1 : 1),而非两个完全相等的区域。这种设计正是为了在保留复制算法优势的同时,大幅降低空间转化代价。
- Eden 区承担了约 80% 的新对象分配压力,绝大多数对象在此“出生”并很快消亡
- 两个 Survivor 区(S0 和 S1)仅各占 10%,它们不同时使用,而是交替充当“From”和“To”角色
- 每次 Minor GC 时,只把 Eden + 当前 From 区中的存活对象,复制到空的 To 区;复制完成后直接清空 Eden 和 From 区
这样做的关键好处是:
- 空间利用率远高于 50%:虽然 Survivor 区总占比 20%,但 Eden 的高占比让整体新生代空间被高效利用
- 对象晋升不是靠“复制到另一半”,而是按年龄或大小条件进入老年代:Survivor 区只是中转站,真正长期存活的对象会在达到年龄阈值(默认 15)或触发动态年龄判定时,直接晋升至老年代,绕开反复复制
- TLAB(线程本地分配缓冲)进一步减少复制开销:每个线程在 Eden 内预划私有小块,对象分配无锁、连续、快速,降低 GC 触发频率
所以,复制算法应对高频对象晋升的策略,本质是:
- 用不对称分区平衡吞吐与回收速度
- 用年龄机制+动态判定控制晋升节奏,避免无效复制
- 用TLAB + 批量复制减少对象移动频次和碎片风险
它不是靠“硬留一半内存等复制”,而是靠分代+比例+条件晋升,把空间转化代价压到最低。











