网络编程
位置:首页>> 网络编程>> JavaScript>> GC与JS内存泄露(3)

GC与JS内存泄露(3)

作者:alucard 来源:Alibaba.com UED 发布时间:2010-09-25 19:01:00 

标签:内存,js,javascript,IE

在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 ;
}

说起来容易,不过当我们程序非常复杂的时候,发现和修改就没有这么容易了。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com