垃圾回收机制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