和标记清除算法一样,标记整理在 V8 当中也会被频繁的使用到。标记整理可以看作是标记清除的增强,因为它们在第一个阶段的标记工作是完全一样的。都会遍历所有的对象然后,将当前的可达活动对象进行标记。只不过是在清除阶段,我们的标记清除直接将没有标记的垃圾对象做空间回收。但是标记整理会在清除之前会有一个整理的工作,移动对象的位置让它们在地址上产生连续。这一块为了理解这样一个过程我们用图示演示下:
标记活动对象:找出可达对象
整理操作:将活动对象空间移动到一起,在地址上变成连续的一块
回收阶段:对活动对象右侧的一个范围去进行整体的回收,回收完成以后就会得到下图这种情况。这种情况相对于我们之前的标记清除算法来说它的好处就会显而易见,因为我们现在内存里面就不会大批量的出现那些分散的小空间。而回收到的小空间都基本上是连续的,在后续的使用过程中如果我们想要申请的时候,就可以尽可能的去最大化利用当前内存当中所释放出来的空间。
这个过程就是标记整理算法,跟之前所提到的一样它会配合着标记清除在 V8 引擎当中实现频繁的 GC 操作。