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