IE内存泄露分析

在IE中经常会有内存泄露出现。

Javascirpt具有自动垃圾回收机制。离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。

对原生JS对象的垃圾回收采用的是标记清除策略

(这是目前主流的垃圾收集算法,基本思想是给当前不使用的值加上标记,然后再并回收内存空间)

但在IE8及以下的版本中,对COM(控件对象模型)对象却采用的计数策略(跟踪记录所有值被引用的次数)

①当访问非原生JS对象(如DOM或BOM元素),并且代码中存在互相循环引用现象时,这种算法就会导致bug:即使清除该Dom元素,退出该上下文也不能释放内存。除非关闭页面。例如

var obj = {};
var doc = document.getElementById("DD");
obj.ele = doc;
doc.myObj = obj;

 解决方法:断开原生JS对象与DOM元素之间的连接,当垃圾收集器下次运行的时候就会删除这些没用的值,并回收内存。如下

obj.ele = null;
doc.myObj = null;

及时解除不再使用的全局变量全局对象属性以及循环引用变量的引用。

 

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

 这里还有一篇介绍的很不错的文章:http://www.cnblogs.com/carekee/articles/1733847.html

 

 

posted @ 2012-09-13 13:39  TiestoRay  阅读(953)  评论(0编辑  收藏  举报