在IE 6中,對于javascript object內部,javascript使用的是mark-and-sweep算法,這點前面也有提到,因此,純粹的javascript對象的使用,不會造成內存泄露,但是對于javascript object與外部object(包括native object和vbscript object等等)的引用時,IE 6使用引用計數(shù),這樣一來,內存泄露就產(chǎn)生了。這點在犀牛書第八章函數(shù)部分有提到。
以下是常見的幾種javascript內存泄露的情況:
一、循環(huán)引用:
< html > < head > < script language = ” JScript ” > var myGlobalObject; function SetupLeak() // 產(chǎn)生循環(huán)引用,因此會造成內存泄露 { // 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,循環(huán)引用出現(xiàn),內存泄露,其原理如下:
解決方案很簡單,在確保屬性不再使用后,加入以下代碼就可以了:
function BreakLeak() // 解開循環(huán)引用,解決內存泄露問題 { document.getElementById( ” LeakedDiv ” ).expandoProperty = null ; }
說起來容易,不過當我們程序非常復雜的時候,發(fā)現(xiàn)和修改就沒有這么容易了。
出處:alibaba.com中國站
責任編輯:bluehearts
上一頁 GC與JS內存泄露 [2] 下一頁 GC與JS內存泄露 [4]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|