码迷,mamicode.com
首页 > 编程语言 > 详细

javascript内存泄露

时间:2015-07-05 12:22:14      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

垃圾回收机制

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

 


循环引用

三个对象 A 、B 、C

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

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}被释放了。

循环引用和闭包

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

DOM循环引用

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

 IE下的内存泄露

在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出: 

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


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

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


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


4、从外到内执行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); 


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

这种方式相当于定义了5000个属性! 


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

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


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

2、内部函数引用(Closures) — Closures可以看成是目前引起大量问题的循环应用的一种特殊形式。由于依赖指定的关键字和语法结构,

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

3、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏其实是一种较小的泄漏,它通常在你浏览过程中,由于内部对象薄计引起。下面我们 

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

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

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

 详细可以参照:http://www.cnblogs.com/carekee/articles/1733847.html

javascript内存泄露

标签:

原文地址:http://www.cnblogs.com/smart-tian/p/4621879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!