javascript内存泄露

垃圾回收机制html

JavaScript不须要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量编程

 


循环引用浏览器

三个对象 A 、B 、C闭包

A->B->C :A的某一属性引用着B,一样C也被B的属性引用着。若是将A清除,那么B、C也被释放。app

A->B->C->B :这里增长了C的某一属性引用B对象,若是这是清除A,那么B、C不会被释放,由于B和C之间产生了循环引用。函数

 1  var a = {};
 2     a.pro = { a:100 };
 3     a.pro.pro = { b:100 };
 4     a = null ; 
 5     //这种状况下,{a:100}和{b:100}就同时也被释放了。
 6             
 7     var obj = {};
 8     obj.pro = { a : 100 };
 9     obj.pro.pro = { b : 200 };
10     var two = obj.pro.pro;
11     obj = null;    
12     //这种状况下 {b:200}不会被释放掉,而{a:100}被释放了。

循环引用和闭包this

1 function outer(){
2         var obj = {};
3         function inner(){ 
4             //这里引用了obj对象
5         }
6         obj.inner = inner;
7     }

DOM循环引用spa

function SetupLeak()  
{  
myGlobalObject = document.getElementById("LeakedDiv");  
document.getElementById("LeakedDiv").expandoProperty = myGlobalObject;  
}  
 

 IE下的内存泄露code

在IE下的JS编程中,如下的编程方式都会形成即便关闭IE也没法释放内存的问题,下面分类给出: 

一、给DOM对象添加的属性是一个对象的引用。范例: 
var MyObject = {}; 
document.getElementById('myDiv').myProp = MyObject; 
解决方法: 
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null; 


二、DOM对象与JS对象相互引用。范例: 
function Encapsulator(element) { 
this.elementReference = element; 
element.myProp = this; 

new Encapsulator(document.getElementById('myDiv')); 
解决方法: 
在onunload事件中写上: document.getElementById('myDiv').myProp = null; 


三、给DOM对象用attachEvent绑定事件。范例: 
function doClick() {} 
element.attachEvent("onclick", doClick); 
解决方法: 
在onunload事件中写上: element.detachEvent('onclick', doClick); 


四、从外到内执行appendChild。这时即便调用removeChild也没法释放。范例: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
document.body.appendChild(parentDiv); 
parentDiv.appendChild(childDiv); 
解决方法: 
从内到外执行appendChild: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
parentDiv.appendChild(childDiv); 
document.body.appendChild(parentDiv); 


五、反复重写同一个属性会形成内存大量占用(但关闭IE后内存会被释放)。范例: 
for(i = 0; i < 5000; i++) { 
hostElement.text = "asdfasdfasdf"; 

这种方式至关于定义了5000个属性! htm


总结一下,内存泄露分为四类:

一、循环引用(Circular References) — IE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用,就会形成内存泄漏。 


这也是Web页面中咱们遇到的最多见和主要的泄漏方式; 

二、内部函数引用(Closures) — Closures能够当作是目前引发大量问题的循环应用的一种特殊形式。因为依赖指定的关键字和语法结构,

Closures调用是比较容易被咱们发现的; 

三、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏实际上是一种较小的泄漏,它一般在你浏览过程当中,因为内部对象薄计引发。下面咱们 

会讨论DOM插入顺序的问题,在那个示例中你会发现只须要改动少许的代码,咱们就能够避免对象薄计对对象构建带来的影响; 

四、貌似泄漏(Pseudo-Leaks) — 这个不是真正的意义上的泄漏,不过若是你不了解它,你可能会在你的可用内存资源变得愈来愈少的时候极 

度郁闷。为了演示这个问题,咱们将经过重写Script元素中的内容来引起大量内存的"泄漏"。 

 详细能够参照:http://www.cnblogs.com/carekee/articles/1733847.html