介绍
V8的垃圾回收策略主要是基于分代垃圾回收机制。在垃圾回收演变的过程中,人们发现没有哪一种办法能够满足所有应用场景。V8内存分为新生代和老生代,新生代就是存活时间较短对象,老生代就是存活时间较长对象。
新生代算法(scavenge)
在分代的基础上,新生代用的是scavenge算法,再具体实现是用cheney算法,它把内存空间一分为二,每一个叫做semispace,这两个semispace一个处于使用,一个处于闲置,处于使用的叫做From,处于闲置的叫做To,赋值时先分配到From,当开始进行垃圾回收时,还在被使用的变量会被复制到To,否则会被直接释放掉,然后From和To互换位置,在开始下一次垃圾回收机制时,如果还被使用则晋升为老生代,或者占用空间大于25%。
它的缺点是只能使用堆内存的一半,这是一个典型的空间换时间算法,但新生代声明周期较短,恰恰就适合这个算法。
老生代算法(mark-sweep & mark-compact)
老生代是用了mark-sweep 和 mark-compact算法,再用scavenge算法不合适。一是太多对象需要被赋值,而且还是没有解决空间问题。mark-sweep标记清除法,是将死亡的对象进行标记,然后去清除,但是这样会产生不连续的内存空间。为了解决这一问题,从mark-sweep演变过来一个mark-compact算法,它是将存活的对象移动到一边,然后清除边界外的内存,当CPU空间不足时效率很高。
V8后续还引入了延迟处理,增量处理,并计划引入标记处理。