1 引用计数
会单独开辟一个空间去统计变量的引用次数,当引用次数为0的时候就被垃圾回收器回收
缺点 会额外占用较大内存 遇到循环引用的对象无法回收垃圾
2 标记清除
将进入环境的变量标记为进入环境,离开环境的标记为离开环境
在运行时,给所有变量标记,然后去掉那些被引用对象的标记以及那些被引用对象引用的标记,最后删除那些有标记的
缺点 会造成内存空间的不连续
标记整理
当标记完成后会将存活的不需要清理的空间移向同一侧,然后清理内存
V8 中的垃圾回收
V8引擎的垃圾回收 引用了标记清除然后加以更改
V8的垃圾回收将内存空间分为两块 一块叫新生区 一块叫老生区 老生区一般存放经过了几次垃圾回收依然存活的数据,通常容量较大
新生区 新生区又将内存划分为两块一块为使用区 一块为空闲区 新创建的数据先放入使用区,当使用区快满了就要进行一次垃圾回收,然后走标记清除机制,再然后将使用区和空闲区对换,当复制到空闲区的对象内存过大时 会被直接移动到老生区,因为空闲区内存占比过大会影响后面的内存分配
新生区的垃圾回收采取了多线程
老生区 老生区就采取标记整理法来垃圾回收
V8垃圾回收进阶
之前的垃圾回收都是一次性不暂停的,这样如果处理时间过久会造成不好的体验所以V8后来改成了分布式垃圾回收即,回收一部分就让程序继续执行,V8创造了三色标记法法 白-灰-黑
标记阶段开始每个根标记为白色,往下寻找子节点,子节点还有就为灰色,全部找完为黑色 下次从灰色开始继续寻找
三色标记法缺点 当新增一个节点时 此时没有灰色节点 但新增节点却有引用,为了解决这种情况,V8团队将回收时判断是否有黑色节点引用白色节点如有,则将白色节点强制改为灰色节点
惰性清理
判断当前容量是否能快速执行下次代码,如果可以则执行代码,垃圾稍后回收