[技术总结] - V8 GC

June 28, 2020

1、 新生代 (from[活跃区], to)
2、 老生代

GC流程:
主动触发GC, 和被动触发(活跃区满了)

新生代的GC: ---- Scavenge (搜寻算法) 新引用的对象(all 对象), 进入新生代的from, 1、 清除未使用的未标记对象, 移动(Move)标记过的对象(>= +1)到to
2、 准备交换from和to
3、 交换之前先把to内标记过2次以上 和 大于to存储区域25%(1/4)的对象移动到老生代
4、 交换from和to(交换后的to为空,from包含一些标记+1的对象)

老生代的GC:---- Mark-Sweep(标记清除),Mark-Compact(标记压缩)

对于老生代中的对象,由于存活对象占较大比重,再采用Scavenge的方式会有两个问题:一个是存活对象较多,复制存活对象的效率将会很低;另一个问题依然是浪费一半空间的问题。为此,V8在老生代中主要采用Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。

Mark-Sweep在标记阶段遍历堆中所有对象,并标记活着的对象,在随后的清除阶段中,只清除没有被标记的对象。总结: Scavenge中只复制活着的对象,而Mark-Sweep只清理死亡对象

Mark-Compact 只在老生代空间不够的时候使用,用来处理Mark-Sweep生成的空间碎片。
在死活对象都存在的情况下,移动活的对象到内存连续区域的一端,然后直接清除掉死亡对象。