js中的垃圾收集
标记清除
各大浏览器中使用广泛
分为标记和清除两个阶段
缺点
1、清除之后内存位置不变,导致空闲内存空间不连续出现碎片化
2、 分配速度慢,因为碎片化,大对象的分配效率会更慢
引用计数
缺点:
需要计数器,占很大的位置
无法解决循环引用问题
优点:
引用计数算法的优点我们对比标记清除来看就会清晰很多,首先引用计数在引用值为 0 时,也就是在变成垃圾的那一刻就会被回收,所以它可以立即回收垃圾
而标记清除算法需要每隔一段时间进行一次,那在应用程序(JS脚本)运行过程中线程就必须要暂停去执行一段时间的 GC,另外,标记清除算法需要遍历堆里的活动以及非活动对象来清除,而引用计数则只需要在引用时计数就可以了
v8的垃圾收集
v8也是基于标记清除算法
分代处理:按存活时间分为新生代 、老生代
新生代:由from区域和to区域组成
采用Scavenge 的算法
当from区域快满时进行一次垃圾收集;对做有标记的对象复制到to区域,完成后from to 区域互换
v8主要使用标记清除,空间不足以对新生代升级过来的对象时才会使用标记整理