代际假说指出大多数对象短命而幸存者长寿,V8据此将堆分为新生代和老生代:新生代用Scavenge算法快速复制存活对象并晋升长龄对象,牺牲50%空间换毫秒级停顿。

代际假说的核心就两点:大多数对象“活不久”,而活过初期的对象往往“很能活”。V8 正是靠这个观察,把堆内存切分成新生代和老生代,让回收更高效。
代际假说的两个关键事实
第一,新创建的对象中,有超过 90% 在几毫秒到几十毫秒内就失去引用,变成垃圾;第二,能撑过几次回收还活着的对象,大概率会继续长期存活。这不是 V8 的主观设定,而是大量真实 JavaScript 应用运行数据总结出的规律,Java、Python 等语言的 GC 也基于同样逻辑。
新生代空间如何体现代际假说
新生代只占堆内存很小一部分(通常 1–8 MB),专为“短命对象”设计。它不追求彻底清理,而是快速过滤:把刚死的、马上要死的快速清掉,把可能长命的挑出来送走。
- 空间被均分为 From 和 To 两个半区,新对象一律分配在 From 区
- 当 From 区快满时触发回收:遍历所有对象,只保留仍被引用的活跃对象
- 存活对象按规则分流——如果已熬过多次回收,或 To 区已占用超 25%,就直接晋升到老生代;否则复制到 To 区
- 复制完成后,From 和 To 角色互换,原 To 成为下一轮的 From,原 From 被整体清空
为什么新生代不用标记-清除
因为新生代对象多、死亡率高,标记-清除要遍历全部对象再逐个清理,开销大且易产生碎片。Scavenge 算法只处理存活对象(数量少),复制即整理,一次操作完成回收+内存紧致,特别适合这种“小而快”的场景。代价是空间利用率只有 50%,但换来的是毫秒级停顿,对交互体验至关重要。
代际假说不是理论游戏,它直接决定了 V8 怎么切内存、用什么算法、什么时候搬对象——理解它,就看清了 JS 内存管理的底层节拍器。

















