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