首頁 > web前端 > js教程 > Javascript 垃圾收集機制介紹理解_基礎知識

Javascript 垃圾收集機制介紹理解_基礎知識

WBOY
發布: 2016-05-16 17:33:49
原創
822 人瀏覽過

經常使用Javascript 的人會琢磨其垃圾收集機制,Javascript 並不像C,C 那樣需要開發者手動去清除垃圾,在編寫Javascript 程式是,開發者無需關心記憶體使用問題,所需記憶體分配以及無用記憶體(垃圾)的回收完全實現了自動管理。究其根源,主要是程式收集那些不再使用的變量,並且釋放其佔用的記憶體。因此,垃圾收集機制會依照固定時間間隔,週期性重複的執行此操作。


舉例來說,局部變數只存在於函數內部,程式會為局部變數在堆疊記憶體或堆疊記憶體中分配對應的儲存空間,當函數運行結束,局部變數所佔用的記憶體就沒有存在的必要了,這時程式會釋放局部變數所佔用的記憶體供其他變數使用。這是程式最簡單釋放記憶體的方法,但是很多時候,程式中變數會一直被使用,此時垃圾收集機制必須追蹤變數並且判斷其是否被使用,是否可以釋放其記憶體空間。

垃圾收集機制主要判斷變數釋放記憶體空間的方法有兩個:其一是標記清除法,其二是引用計數法。

標記法,每個變數都有其運行環境,變數創建後會在某種環境中運行,例如創建一個局部變量,局部變數會運行在函數體內。當函數運行時,會標記局部變數為“進入環境”,當函數體運行結束後,表示變數脫離了其運行環境,此時則將變數標記為“離開環境”。對於「離開環境」的變量,垃圾收集機制會進行相應記錄,並在下一個回收週期時將其釋放。

引用計數法,追蹤記錄每個值的被引用次數。宣告一個變數並將一個引用型別值賦給該變數時,這個值得被引用次數就是 1。如果同一個值又被賦給另一個變量,則該值的引用次數加 1。相反,如果包含這個值的引用的變數又取得另一個值,這個值得引用次數減 1。當這個值得引用次數為 0 時,則表示沒有辦法再存取此值,因此就可以將其佔用的記憶體空間回收。當垃圾收集器在下一個週期運作時,會釋放引用次數為零的值所佔用的記憶體空間。 (原文解釋參考:Javascript 高階程式設計- 第二版)

舉例來說:

複製程式碼



複製程式碼



複製程式碼


程式碼如下:

此函數運轉退出後,object1 的計數器讀數為1,object2 的計數器度數為1。所以兩個變數都不會被銷毀。如果大量的這樣的程式存在於函數體內,就會導致大量的記憶體被浪費而無法回收,從而導致記憶體的洩漏。

上述問題解決方法,手動釋放 object1 object2 所佔用的記憶體。即:



複製碼對比上面的例子,舉一個正常情況下的例子。 複製程式碼 程式碼如下:

            function countMethod(){
                            var object2 = new Object(); // 宣告變量,計數器由0 變成1
                  object1.method1 = "This is object1";  //       object2.method2 = "This is object2";  // object2 計數器-1, object2 讀數變為0
            }


透過上例看出,正常情況下,當函數運轉結束後,object1 object2的垃圾讀數皆為0015週期,在下一個讀數時會收集垃圾週期被回收並且釋放其所佔用的記憶體。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板