在IE 6中,对于javascript object内部,javascript使用的是mark-and-sweep算法,这点前面也有提到,因此,纯粹的javascript对象的使用,不会造成内存泄露,但是对于javascript object与外部object(包括native object和vbscript object等等)的引用时,IE 6使用引用计数,这样一来,内存泄露就产生了。这点在犀牛书第八章函数部分有提到。
以下是常见的几种javascript内存泄露的情况:
一、循环引用:
< html > < head > < script language = ” JScript ” > var myGlobalObject; function SetupLeak() // 产生循环引用,因此会造成内存泄露 { // First set up the script scope to element reference myGlobalObject = document.getElementById( ” LeakedDiv ” ); // Next set up the element to script scope reference document.getElementById( ” LeakedDiv ” ).expandoProperty = myGlobalObject; } </ script > </ head > < body onload = ” SetupLeak() ” > < div id = ” LeakedDiv ” ></ div > </ body > </ html >
我们可以看到,myGlobalObject指向了一个DOM对象,而这个DOM对象的一个属性又指向了myGlobalObject,循环引用出现,内存泄露,其原理如下:

解决方案很简单,在确保属性不再使用后,加入以下代码就可以了:
function BreakLeak() // 解开循环引用,解决内存泄露问题 { document.getElementById( ” LeakedDiv ” ).expandoProperty = null ; }
说起来容易,不过当我们程序非常复杂的时候,发现和修改就没有这么容易了。
出处:alibaba.com中国站
责任编辑:bluehearts
上一页 GC与JS内存泄露 [2] 下一页 GC与JS内存泄露 [4]
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|