js中的垃圾收集

标记清除

各大浏览器中使用广泛

分为标记和清除两个阶段

缺点
1、清除之后内存位置不变,导致空闲内存空间不连续出现碎片化
2、 分配速度慢,因为碎片化,大对象的分配效率会更慢

优点:
功能比较强大,可以解决循环引用问题

引用计数

缺点:
需要计数器,占很大的位置
无法解决循环引用问题

优点:
引用计数算法的优点我们对比标记清除来看就会清晰很多,首先引用计数在引用值为 0 时,也就是在变成垃圾的那一刻就会被回收,所以它可以立即回收垃圾
而标记清除算法需要每隔一段时间进行一次,那在应用程序(JS脚本)运行过程中线程就必须要暂停去执行一段时间的 GC,另外,标记清除算法需要遍历堆里的活动以及非活动对象来清除,而引用计数则只需要在引用时计数就可以了

v8的垃圾收集

v8也是基于标记清除算法

分代处理:按存活时间分为新生代 、老生代

新生代:由from区域和to区域组成
采用Scavenge 的算法

当from区域快满时进行一次垃圾收集;对做有标记的对象复制到to区域,完成后from to 区域互换

v8主要使用标记清除,空间不足以对新生代升级过来的对象时才会使用标记整理