浏览器的垃圾回收机制:
就是js执行环境(浏览器,window) 会负责代码执行过程中使用的内存
原理:垃圾收集器会定期的(周期性)找出不再使用的变量,释放内存
为什么要定期而不是实时监测呢?
因为垃圾回收时需要停止响应其他操作,垃圾回收开销比较大,所以这个
过程在设计之初就不是实时的,而是按照固定的时间周期性的执行
== 两种实现方式
1 标记清除 - 较为常用
2 引用计数 - 不太常用
== 大部分浏览器使用的时候选择标记清除的垃圾回收策略或者类似策略
什么时候出发垃圾回收机制呢
js引擎垃圾回收方案是编辑清除
也就是 遍历所有可访问的对象
回收已经不可访问的对象
let arr = [1, 2, 3, 4]
arr = null
标记清除
1 不能释放‘进入环境’的变量所占的内存(js的预编译),只要执行流进入相应的环境
就可能用的他们,而当变量离开环境的时候,则将其标记为‘离开环境’
2 进行标记的方式由很多种:翻转某个特殊位来记录一个变量何时进入环境
使用一个‘进入环境’变量列表和一个离开环境变量列表
3 垃圾回收器在运行的时候会给所有变量都加上标记,
然后环境中的变量以及环境中的变量的引用变量,他们身上的标记会被去掉
4 而在此之后再被加上标记的变量,将被视为准备删除的变量
5 最后,垃圾收集器完成内存清楚工作,销毁那些标记的值并收回他们所占用的内存空间
引用计数 跟踪记录每个值被引用的次数
1 当声明了一个变量,并将一个引用类型赋值给该变量时,则这个值的引用次数是1
2 如果同一个值又被赋予另外一个变量,则改值的引用次数+1
3 相反如果这个值的引用又取得了另外一个值,则引用次数-1
4 当这个引用计数为0的时候,则说明没有变量引用这个值了
5 当垃圾收集器下次再运行的时候,他就会销毁那些标记的值并收回他们所占用的内存空间