JS的垃圾回收


一、什么是垃圾回收

  JS垃圾回收機制的目的是為了防止內存泄漏,內存泄漏是指有一些已經不被需要的變量但仍然存在在內存中,這樣便會造成內存泄漏。垃圾回收機制就是為了回收這些不被需要的變量,並且釋放掉他們所指向的內存。

  Java、JavaScript等一些語言有垃圾回收機制,但是C\C++沒有。其實我也不是很清楚為什么會有這樣的區別。請知道的dalao可以評論告訴我一下!!!謝謝么么噠

 

二、JS垃圾回收的方法

  • 標記清除
    • 這是最常見的回收方法,也是大部分瀏覽器使用的回收方法。
    • 當變量進入執行環境是,就會被標記上“進入環境”,從邏輯上講,被標記上“進入環境”的變量所指向的內存是永遠不會被回收的。當某個變量離開執行環境時,就會被標上“離開環境”。被標記為“離開環境”的變量則是可以回收的。
      function func() {
          const a = 1;
          const b = 1;
          // 此時變量a, b 分別被標記為 進入環境      
      }
      
      func();      // 函數執行完畢,a, b 被標記為 離開環境,此時a, b 被回收

       

  • 引用計數
    • 這是一種不太常見的回收方式。引用計數法就是同級引用類型聲明后被引用的次數,當次數為0時,該變量就會被回收。
  • 存在缺點,會存在內存泄漏。
    // 正常的引用計數
    function func() {
        const c = {};
        let d = c;      // c 被 d 引用一次,c的引用計數為 1
        let e = c;      // c 被 e 引用一次,c的引用計數為 2
        d = {};        // d 不再引用c,c的引用計數減為 1
        e = null;      // e 也不在引用c,c的引用計數減為 0,此時c將會被回收
    }
    
    
    
    // 有缺陷的引用計數,內存泄漏
    function func() {
        let f = {};    
        let g = {};
        f.prop = g;
        g.prop = f;
        // 由於 f 和 g 相互引用,計數永遠不為0
    }

 

三、有可能造成內存泄漏的案例

  • 全局變量造成的內存泄漏
  • 未銷毀的定時器和回調函數造成的內存泄漏
  • DOM引用造成的內存泄漏
    var elements = {
        txt: document.getElementById('test');
    }
    
    function fn(){
        elements.txt.innerHTML = '11111';
    }
    
    function removeTxt(){
        document.body.removeChild(document.getElementById('test'));
    }
    
    fn();
    removeTxt();
    console.log(element.txt);      // <div id='test'>11111</div>
    
    
    // 雖然我們已經移除了id為text的元素,但我們認為無法對此進行回收。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM