# V8 垃圾回收

标记清除引用计数

# 标记清除

function test(){  
  var a=10;//被标记,进入环境  
  var b=20;//被标记,进入环境  
}  
test();//执行完毕之后a、b又被标记离开环境,被回收
1
2
3
4
5

# 引用计数

function test(){  
  var a={};//a的引用次数为0  
  var b=a;//a的引用次数加1,为1  
  var c=a;//a的引用次数加1,为2  
  var b={};//a的引用次数减1,为1  
}  
1
2
3
4
5
6

# 会引发内存泄漏的情况

# 使用全局变量

# 闭包引起的内存泄露

# 没有清除的DOM引用

# 被遗忘的定时器或者回调

var someResouce=getData();  
setInterval(function(){  
    var node=document.getElementById('Node');  
    if(node){  
        node.innerHTML=JSON.stringify(someResouce)  
    }  
},1000)
1
2
3
4
5
6
7

这样的代码很常见, 如果 id 为 Node 的元素从 DOM 中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对 someResource 的引用, 定时器外面的 someResource 也不会被释放

# 循环引用

// 造成循环引用
window.onload=function outerFunction(){  
  var obj=document.getElementById("element"):  
  obj.onclick=function innerFunction(){};  
};

// 手动解除引用
myObject.element=null;  
element.o=null;  
window.onload=function outerFunction(){  
  var obj=document.getElementById("element"):  
  obj.onclick=function innerFunction(){};  
  obj=null;  
};  
1
2
3
4
5
6
7
8
9
10
11
12
13
14