Skip to content

内存泄漏

未能释放已不再使用的内存

垃圾回收机制

JS 具有自动垃圾回收机制,垃圾回收器会定期扫描所有对象,找出那些不再使用的对象,然后释放其占用的内存。

两种方式实现:

  • 标记清除(最常用):销毁所有不可达带标记的变量
  • 引用计数:引用次数为0时销毁

常见的内存泄漏

  • 意外的全局变量
  • 被遗忘的计时器或回调函数
  • 脱离 DOM 的引用

意外的全局变量

js
function foo(arg) {
    bar = "this is a hidden global variable";
}

被遗忘的计时器或回调函数

js
var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        node.innerHTML = JSON.stringify(someResource));
    }
}, 1000);

脱离 DOM 的引用

js
var elements = {
    button: document.getElementById('button'),
    image: document.getElementById('image'),
    text: document.getElementById('text')
};
function doStuff() {
    image.src = 'http://some.url/image';
    button.click();
    console.log(text.innerHTML);
}
function removeButton() {
    document.body.removeChild(document.getElementById('button'));
    // 此时 button 元素仍然存在于 elements 对象中
}