V8新生代垃圾回收机制 - Orinoco

853 阅读2分钟

Orinoco: young generation garbage collection

V8 为了更好的管理内存,定义了两个主要的生命周期:新生代 young generation 和老生代 old generation。当我们创建一个新对象🦛时,V8会将她放入新生代里,而新生代又分成了两个阶段,一个叫 nursery,另一个叫 intermediate。🦛会先进入 nursery 阶段。

好的,在短暂时间内V8会执行一次垃圾回收,如果🦛很坚挺,她会进入到intermediate阶段。嗯同样的,如果🦛又经历了一次垃圾回收而存活,则最终进入老生代。下图很好的展现了该过程:

新生代详细介绍

由于 V8 给新生代分配的空间很小(只有可怜的16MB),所以需要经常的去执行回收操作防止新生代内存爆满。而对于新生代内部,实际上是分成了两个区域,一个用于存放对象,另一个则是空的。当执行一次垃圾回收后,存活下来的对象会被复制一份并将他转移到空的一侧,因为这样可以动态的压缩内存。

从 v6.2 开始,V8 GC 由之前的单线程变成了现在的并行处理。下面分别介绍下。

Single-threaded Cheney’s Semispace Copy 单线程复制法

在一次新生代垃圾处理前,之前分好的两半空间都会被做上标记:一个叫来源空间 from-space,另一个是丢弃空间 to-space

由下图可以看到,整个回收分成了三个步骤:

  1. 扫描根节点(找出可达和不可达的对象),标记空间指针
  2. 在新生代中完成对象的复制
  3. 将新生代提升到老生代或者被回收掉

整个垃圾回收的过程是单线程的,也就是说直到处理完所有的新对象后,垃圾回收才会停止。

Parallel Mark-Evacuate 并行标记法

基本同上,只不过第一步和第二步时并行的。如下图所示。

Parallel Scavenge 并行垃圾回收

基本同上,全部并行执行。如下图所示。