Javascript 垃圾收集機制

來源:互聯網
上載者:User

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

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

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

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

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

  舉個例子來說:
            function countMethod(){
                  var object1 = new Object(); // 聲明變數,計數器由 0 變為 1
                  var object2 = new Object(); // 聲明變數,計數器由 0 變為 1
                  object1.method1 = object2;  // object1 計數器 -1,object2 計數器 +1
                  object2.method2 = object1;  // object1 計數器 +1,object2 計數器 -1
            }
  此函數運行退出後,object1 的計數器讀數為 1,object2 的計數器度數為 1。所以兩個變數都不會被銷毀。如果大量的這樣的程式存在於函數體內,就會導致大量的記憶體被浪費而無法回收,從而導致記憶體的泄露。

  上述問題解決方案,手動釋放 object1 object2 所佔用的記憶體。即:
                 object1.method1 = null;
                 object2.method2 = null;

  對比上面的例子,舉一個正常情況下的例子。
            function countMethod(){
                  var object1 = new Object(); // 聲明變數,計數器由 0 變為 1
                  var object2 = new Object(); // 聲明變數,計數器由 0 變為 1
                  object1.method1 = "This is object1";  // object1 計數器 -1,object1 讀數變為0
                  object2.method2 = "This is object2";  // object2 計數器 -1,object2 讀數變為0
            }
  通過上例看出,正常情況下,當函數運行結束後,object1 object2的讀數均為 0,在下一個垃圾收集周期時,會被回收並且釋放其所佔用的記憶體。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.