js垃圾回收機制


通過鏈接過來的朋友知道閉包存在內存不清除問題,也就是局部變量本來要自動清除的,現在不清除了,那么這個清除是怎么個清除法?

手動清除法:適用於閉包不用了的情況下

function outer() {
        var a = 1;
      return function inner() {
            a = a + 1;
            console.log(a)
        }
    }
    // fn和inner函數連在一起,不能自動清理a
    var fn = outer();
   //  不用閉包了,跟inner斷開聯系
    fn = null

標記-清除法(瀏覽器默認,有內存儲存不連續缺點):說的簡單點,不同瀏覽器都是固定時間清理一次,清理那些不再需要的變量,只不過不同瀏覽器的時間不同而已,都說了是標記-清除,首先要標記。【CG算法】(共軛梯度)(迭代)

標記:從windows全局對象開始往下找,找到了做個標記,做什么標記不重要(紅寶書),沒找到的也就是沒標記的都要清除。也就是為什么把outer()給全局fn就不用清除a了呢,因為賦值給fn,windows下找到了fn,fn又找到了a所以清除不了。

清除:垃圾清理器清理就好

引用計數法(循環引用無法清除):記錄引用次數,0次就可以清除了,循環引用是致命的,所以瀏覽器都拋棄了引用計數法

var obj1 = {
        fn: function(a) {
          console.log(a);
        }
      };
      var obj2 = {
        fn: function(b){
            console.log(b);  
        }
      };
      // obj1引用了obj2,obj2引用了obj1,引用計數法無法清除
      obj1.fn(obj2)
      obj2.fn(obj1)

 

最后說一下內存泄露(以后沒用又清除不了)的幾種常見情況:全局變量(無法被回收機制清除,不知道以后會不會還會用)閉包(感覺本質上還是全局變量不能回收引起的)(DOM清除下)事件未清理


免責聲明!

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



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