垃圾回收机制

1. 标记清除

  • 垃圾回收器可以检查root和它的所有子对象是否存在
  • 可达的不是垃圾
  • 未被标记的内存会被当做垃圾

不需要的引用:开发者明知内存引用不再需要,却由于某些原因,它仍被留在激活的 root 树中

2. 引用计数

为0释放,如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏。

1
2
3
4
const arr = [1, 2, 3, 4];
console.log('hello world');

// arr = null; 释放

3. WeakMap的弱应用

weakMap,如果引用的释放了,则WeakMap 内部的引用,就会自动被垃圾回收清除
WeakMap 示例

案例

1. 意外的全局变量

1
2
3
4
function foo(arg) {
bar = "this is a hidden global variable";
// 浏览器中window.bar
}

另外:缓存数据是为了重用,缓存必须有一个大小上限才有用。高内存消耗导致缓存突破上限,因为缓存内容无法被回收。
解决:在 JavaScript 文件头部加上 ‘use strict’

2. 闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var theThing = null;
var replaceThing = function () {
var originalThing = theThing;
var unused = function () {
if (originalThing) {
console.log('hi');
}

};
theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000);

解决:在 replaceThing 的最后添加 originalThing = null

参考资料

4类 JavaScript 内存泄漏及如何避免