Scavenge与Mark-Sweep的区别

Scavenge 中只复制活着的对象,而 Mark-Sweep 只清理死亡对象。

活对象在新生代中只占较小部分,死对象在老生代中只占较小部分,这是两种回收方式能高效处理的原因。Mark-Sweep 在老生代空间中标记后的示意图如下图,黑色部分标记为死亡的对象:

完成移动后,就可以直接清除最右边的存活对象后面的内存区域完成回收。

这里将 Mark-Sweep 和 Mark-Compact 结合着介绍不仅仅是因为两种策略是递进关系,在 V8 的回收策略中两者是结合使用的,下图是目前介绍到的 3 种主要垃圾回收算法的简单对比:

从表中可以看到,在 Mark-Sweep 和 Mark-Compact 之间,由于 Mark-Compact 需要移动对象,所以它的执行速度不可能很快,所以在取舍上,V8 主要使用 Mark-Sweep,在空间不足以对从新生代中晋升过来的对象进行分配时才使用 Mark-Compact。