什么是垃圾回收?
垃圾回收就是,函数已经执行完成,删除那些再也用不到的属性。
垃圾回收算法
- 引用计数(之前用的策略)
根据变量被引用次数来做销毁凭证,当变量的引用次数为0时被销毁。
缺陷:循环引用无法销毁
- 标记清除(现在的策略)
定期遍历 window 的各个属性,遍历完之后看看能不能得到某个对象,如果得到便保留,如果得不到则删除。
闭包是内存泄漏吗?
内存泄漏是非预期的情况,闭包是预期情况,所以不是内存泄漏,但是闭包会导致变量无法被回收。
检测内存变化
可以使用 chrome 浏览器的 Performance 工具来检测。如果内存一直上升则内存存在泄漏,如果出现上升下降的锯齿状则正常。
内存泄漏的场景(Vue为例)
-
被全局变量、函数引用,组件销毁时未销毁
-
被全局事件、定时器引用,组件销毁时未清除
-
被自定义事件引用,组件销毁时未清除
注意:使用自定义事件时,不要使用箭头函数,会导致事件无法被清除。
WeakMap、WeakSet
-
WeakMap 的 key 只能是 Object 或者继承 Object 的类型。
-
WeakSet 中的值只能是 Object 或者继承 Object 的类型。
-
WeakMap 和 WeakSet 都是弱引用关系,方便被垃圾回收。