淺談JavaScript的自動(dòng)垃圾收集機(jī)制
執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存,編寫(xiě)JavaScript程序時(shí),所需內(nèi)存的分配以及無(wú)用內(nèi)存的回收完全實(shí)現(xiàn)自動(dòng)管理。
原理:
找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器會(huì)按照固定的時(shí)間間隔(或代碼執(zhí)行中預(yù)定的收集時(shí)間)周期性地執(zhí)行這一操作。
垃圾收集的方式:
1.標(biāo)記清除(mark-and-sweep)
最常用的垃圾收集方式。當(dāng)變量進(jìn)入環(huán)境時(shí),就將變量標(biāo)記為“進(jìn)入環(huán)境”。從邏輯上講,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占用的內(nèi)存,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境,就可能會(huì)用到它們。當(dāng)變量離開(kāi)環(huán)境時(shí),則將其標(biāo)記為“離開(kāi)環(huán)境”。
立即收集器在運(yùn)行時(shí)會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記,然后它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。剩下的在被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無(wú)法訪(fǎng)問(wèn)到這些變量。最后,垃圾收集器完成內(nèi)存清除,銷(xiāo)毀那些帶有標(biāo)記的值并收回它們所占用的內(nèi)存空間。
2.引用計(jì)數(shù)(reference counting)
跟蹤記錄每個(gè)值被引用的次數(shù),當(dāng)這個(gè)值的引用次數(shù)為0時(shí),說(shuō)明沒(méi)有辦法再訪(fǎng)問(wèn)這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來(lái)。當(dāng)垃圾收集器下次再運(yùn)行時(shí),會(huì)釋放那些引用次數(shù)為零的值所占用的內(nèi)存。
(1)應(yīng)用機(jī)制存在一個(gè)問(wèn)題:循環(huán)引用。
循環(huán)引用是指對(duì)象A中包含一個(gè)指向?qū)ο驜的指針,而對(duì)象B中也包含一個(gè)指向?qū)ο驛的引用。(這樣它們的引用可能永遠(yuǎn)不為0,如果函數(shù)被重復(fù)多次調(diào)用,就會(huì)導(dǎo)致大量的內(nèi)存得不到回收。)
(2)IE中的BOM和DOM中的對(duì)象使用C++以COM(component Object Model,組件對(duì)象模型)對(duì)象的形式實(shí)現(xiàn),而COM對(duì)象的垃圾收集機(jī)制采用的是引用計(jì)數(shù)策略。
以下是COM對(duì)象導(dǎo)致的循環(huán)引用的問(wèn)題:
eg:
var element=document.getElementById("some_element"); var myObject=new Object(); myObject.element=element; element.someObject=myObject;
上面的例子在一個(gè)DOM元素(element)和一個(gè)原生JavaScript對(duì)象(myObject)之間創(chuàng)建了循環(huán)引用。由于存在這個(gè)循環(huán)引用,即使將例子中的DOM從頁(yè)面移除,它也永遠(yuǎn)不會(huì)被回收。
可以使用以下代碼手工斷開(kāi)原生JavaScript和DOM元素之間的鏈接:
myObject.element=null; element.someObject=null;
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
JS數(shù)組方法shift()、unshift()用法實(shí)例分析
這篇文章主要介紹了JS數(shù)組方法shift()、unshift()用法,結(jié)合實(shí)例形式分析了JavaScript數(shù)組shift()與unshift()方法功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-01-01使用classList來(lái)實(shí)現(xiàn)兩個(gè)按鈕樣式的切換方法
下面小編就為大家分享一篇使用classList來(lái)實(shí)現(xiàn)兩個(gè)按鈕樣式的切換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01使用Microsoft Ajax Minifier減小JavaScript文件大小的方法
大家用來(lái)減小JavaScript文件下載大小的常見(jiàn)的方式有2種: 壓縮(compression)和縮?。╩inification)。2010-04-04JavaScript實(shí)現(xiàn)扯網(wǎng)動(dòng)畫(huà)效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript語(yǔ)言實(shí)現(xiàn)扯網(wǎng)動(dòng)畫(huà)效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JS有一定的幫助,需要的可以參考一下2022-06-06JS實(shí)現(xiàn)簡(jiǎn)單打字測(cè)試
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)簡(jiǎn)單打字測(cè)試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06