内存声明周期
- 分配所需要的内存
- js在定义变量时就完成了内存分配
- 还会通过函数调用分配内存(看返回的时对象,元素还是字符串来决定)
- 使用分配到的内存(读,写)
- 使用值的过程实际上就是对分配内存进行读写的操作,可能是写入一个变量或者写入对象的属性值,甚至是传递参数的函数
- 不需要时将内存释放/归还
- js嵌入了垃圾处理器,找出哪些不再继续使用的变量,释放其占用的内存
- 常用的两个垃圾回收算法——引用计数以及标记清除
- 引用计数:跟踪记录每个值被引用的次数,把对象是否不再需要这个概念简单理解为,对象有没有其他对象引用它,发现一次引用+1,解除一次引用-1,直到监听到引用为0时认为可以被回收
- 引用计数有个限制,无法处理循环引用,当两个对象呗循环调用时,引用计数会考虑到它们至少有一次引用,所以不会把他们进行回收,对DOM对象进行垃圾回收时就会容易出现这个问题导致DOM元素从DOM树上删除之后,其拥有的内存也没办法被释放
- 标记清除:标记变量何时进入环境以及何时离开环境,把对象是否不再需要这个概念理解为对象是否可以获得
- 算法假定设置一个root对象,垃圾回收器定期从root对象开始,找所有从根开始引用的对象然后找这些对象引用的对象,这样会找到所有可以获得的对象,收集所有不能获得的对象,把这些进行标记并清除
内存泄漏
当不再使用的内存没有被得到及时的释放,就会引发内存泄漏
常见的内存泄漏:闭包,意外的全局变量(let a=b=0
),定时器没有清除id,脱离DOM的引用(就是楼上说的那个引用计数的限制)