JS垃圾回收机制
「2019-09-22 发布,部分内容可能已过时,请合理参考」浏览器:
引用计数法
引用计数法:对象被引用一次引用次数就 +1,引用次数为0 后,垃圾回收运行时清理掉次数为0 的
- 优点:引用计数只需要在计数为0 时就可以回收,不需要遍历所有对象
- 缺点:计数器需要占很大的空间,无法解决循环引用无法回收的问题
标记清除法
标记清除法:定期将活动对象和不活动的对象进行分别标记,然后开始清除工作,最后还原标记,等待 下一轮清除工作
- 优点:算法简单,
- 缺点:(内存碎片化,分配速度慢)清除后剩余的对象内存位置不变,导致空闲内存空间不连续,出现了内存碎片
标记整理算法在标记结束后,将活动对象往内存一边移动
分代式回收
V8回收机制优化:
分代式垃圾回收
- 新生代回收:Scavenge算法、Cheney算法,Cheney算法将新生代内存一分为二,使用区和空闲区, 对活动区的对象进行标记,清理,活动区和空闲区身份互换,交换两次后,将活动区还在的老对象 放到老生代,如果交换后空闲区超过25%,将会把对象都放到老生代
- 老生代:存放一些空间大、存活时间长,如果放在新生代频繁复制交换,会非常耗时;老生代使用 标记清除法,进行清除,排序整理,标记整理 并行回收,读写锁 全停顿,增量标记、三色标记、写屏障 惰性清理