v8 引擎GC 垃圾回收机制及算法

## 描述引用计数的工作原理和优缺点

引用计数算法的原理是设置一个引用数,判断当前引用数是否是 0。
代码中有一个对象空间,多了一个变量名指向它,引用计数器就为它的引用数 + 1,减 b 少一个引用引用计数器就为它的引用数 - 1, 一旦引用数变为 0, 该对象空间就会被认为是垃圾,然后被回收。

引用计数算法的优点:
发现了垃圾可以立即回收,一旦引用数为 0 就进行回收。
可以避免程序的暂停,因为一旦程序内存将要爆满的时候,引用计数就会找到垃圾并进行回收。

引用计数算法的缺点:
无法回收循环引用的对象, 由于代码自身互相引用所以根据引用计数法的回收条件,是无法被回收的。
时间开销大,因为引用计数算法需要维护引用数,一旦发现引用数发生改变需要立即对引用数进行修改。

## 描述标记整理算法的工作流程

标记-清除算法会使内存产生碎片,那么如何解决这个问题,很显然,清除以后再整理一下内存不就行了么。
然而标记-整理算法不是简单滴整理一下内存。
标记-整理(Mark-Compact)算法不直接对可回收对象进行清理,而是让所有可用的对象都向一端移动。然后直接清理掉边界意外的内存。

## 描述 V8 中新生代存储区垃圾回收的流程

回收过程采用复制算法 + 标记整理算法
新生代内存区分为两个等大小的空间
使用空间为 From,空闲空间为 To
标记整理后将活动对象拷贝至 To
From 与 To 交换空间完成释放

回收细节说明
拷贝过程可能出现晋升
晋升就是将新生代对象移动至老生代
一轮 GC 还存活的新生代需要晋升
To 空间的使用率超过 25%(避免后续存储数据时,空间不足的问题)

## 描述增量标记算法在何时使用及工作原理

将一整段垃圾回收操作分成几个小段
垃圾回收与程序执行交替完成
程序执行一段时间后,产生垃圾对象,开始遍历对象进行标记,第一次标记可能就标记第一层活动对象,第二次标记所有活动对象,最后对空间进行回收。
posted @ 2022-03-04 16:00  有肌肉的小眼睛  阅读(80)  评论(0编辑  收藏  举报