新生代划分为eden区和两个survivor区(s0、s1),旨在高效处理对象“朝生夕死”特征、避免碎片并加速minor gc;eden占约80%空间,用于快速分配与清理;双survivor通过复制+角色互换保障内存连续;对象每经历一次survivor复制年龄加1,达阈值15即晋升老年代;复制算法因存活率低而适用,以少量空间换gc效率。

新生代划分为 Eden 区和两个 Survivor 区(S0 和 S1),根本上是为了高效处理“大量对象朝生夕死”这一现实特征,同时避免内存碎片、提升 Minor GC 速度。
Eden 区:专供新对象快速分配
几乎所有新创建的对象都优先落在 Eden 区。它占新生代约 80% 空间,设计目标是“快进快出”——对象进来得快,被回收得也快。一旦 Eden 满了,立刻触发 Minor GC;此时约 90% 的对象已不可达,直接被清理,几乎不涉及移动操作,所以耗时极短。
两个 Survivor 区:解决复制过程中的碎片问题
如果只设一个 Survivor 区,就会出现如下困境:
- 第一次 Minor GC 后,Eden 中存活对象搬入 Survivor;
- 第二次 GC 时,Eden 新的存活对象 + 原 Survivor 中仍存活的对象,需合并存放;
- 但这两批对象内存布局天然不连续,硬塞进同一块区域必然产生碎片。
而两个 Survivor 区通过“复制 + 角色互换”机制规避了这个问题:每次 GC 只把存活对象统一复制到一个空的 Survivor 区(To),原 Eden 和另一个 Survivor(From)则整块清空。复制后直接交换角色,保证始终有一个完全干净、连续可用的空间。
年龄机制配合晋升:精准筛选长生命周期对象
每次对象在 Survivor 区间成功复制一次,GC 年龄就加 1。默认阈值为 15,达到即晋升老年代。这个过程不是靠猜测,而是用真实存活次数做判断:
- 刚过一轮 GC 就死掉的,留在 Eden 就被清掉了;
- 反复活下来的,才逐步进入 Survivor,再慢慢变“老”;
- 真正稳定、长期存活的对象,才会最终进入老年代,避免老年代被频繁填满、触发代价高昂的 Full GC。
复制算法在此处最适用
新生代对象存活率低,复制算法(只搬存活对象,其余空间直接丢弃)比标记-清除或标记-整理更轻量。两个 Survivor 区就是为复制算法服务的基础设施——它不追求空间利用率最大化,而是用少量额外空间(约 20% 新生代)换来 GC 停顿时间的大幅降低和内存布局的绝对规整。











