JavaScript内存泄露

来源:互联网 发布:淘宝运费险漏洞 编辑:程序博客网 时间:2024/06/08 08:35

JS内存泄露:

JS是一种垃圾收集式语言,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回,IE和Mozilla Firefox俊使用引用计数来为DOM对象处理内存,在引用计数系统,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它,如果计数为零,该对象就会被销毁,其占用的内存也会返回给堆,这种方案在循环引用方面存在一些盲点

当一个DOM对象包含一个JS对象的引用(例如一个Event Handler),而这个JS对象又持有对这个DOM对象的引用时,一个环状引用就形成了,在IE浏览器中DOM结构并不受JS解释机制管理,所以它并不能理解这种失去外界引用的环状结构,导致环上的任何对象都无法被访问到,可是内存依旧占据着,这就是所谓的JS内存泄露

例子:

var q = [];var n = 0;setInterval(function(){q.push(makeSpan());if(q.length >= 10){var s = q.shift();if(s){a.parentNode.removeChild(s);}}n++;},10)function makeSpan(){var s = document.createElement('span');document.body.appendChild(s);var t = document.createTextNode('***' + n + '***');s.appendChild(t);s.onclick = function(e){s.style.backgroundColor = 'red';alert(n);}return s;}
该例子在IE8下会出现内存泄露(可在执行时,打开任务管理器查看)

解决方案:

在删除节点的时候,手动破除环状引用

setInterval(function(){q.push(makeSpan());if(q.length >= 10){var s = q.shift();if(s){s.onclick = null;//解决内存泄露问题a.parentNode.removeChild(s);}}n++;},10)

0 0