js内存泄露
垃圾回收机制
1. 标记清除
- 垃圾回收器可以检查root和它的所有子对象是否存在
- 可达的不是垃圾
- 未被标记的内存会被当做垃圾
不需要的引用:开发者明知内存引用不再需要,却由于某些原因,它仍被留在激活的 root 树中
2. 引用计数
为0释放,如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏。
1 | const arr = [1, 2, 3, 4]; |
3. WeakMap的弱应用
weakMap,如果引用的释放了,则WeakMap 内部的引用,就会自动被垃圾回收清除
WeakMap 示例
案例
1. 意外的全局变量
1 | function foo(arg) { |
另外:缓存数据是为了重用,缓存必须有一个大小上限才有用。高内存消耗导致缓存突破上限,因为缓存内容无法被回收。
解决:在 JavaScript 文件头部加上 ‘use strict’
2. 闭包
1 | var theThing = null; |
解决:在 replaceThing 的最后添加 originalThing = null