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