js 内存泄漏如何检查?场景有哪些?

109 阅读1分钟

什么是垃圾回收?

垃圾回收就是,函数已经执行完成,删除那些再也用不到的属性。

垃圾回收算法

  • 引用计数(之前用的策略)

根据变量被引用次数来做销毁凭证,当变量的引用次数为0时被销毁。

缺陷:循环引用无法销毁

  • 标记清除(现在的策略)

定期遍历 window 的各个属性,遍历完之后看看能不能得到某个对象,如果得到便保留,如果得不到则删除。

闭包是内存泄漏吗?

内存泄漏是非预期的情况,闭包是预期情况,所以不是内存泄漏,但是闭包会导致变量无法被回收。

检测内存变化

可以使用 chrome 浏览器的 Performance 工具来检测。如果内存一直上升则内存存在泄漏,如果出现上升下降的锯齿状则正常。

内存泄漏的场景(Vue为例)

  • 被全局变量、函数引用,组件销毁时未销毁

  • 被全局事件、定时器引用,组件销毁时未清除

  • 被自定义事件引用,组件销毁时未清除

注意:使用自定义事件时,不要使用箭头函数,会导致事件无法被清除。

WeakMap、WeakSet

  • WeakMap 的 key 只能是 Object 或者继承 Object 的类型。

  • WeakSet 中的值只能是 Object 或者继承 Object 的类型。

  • WeakMap 和 WeakSet 都是弱引用关系,方便被垃圾回收。