js垃圾回收機制

經過連接過來的朋友知道閉包存在內存不清除問題,也就是局部變量原本要自動清除的,如今不清除了,那麼這個清除是怎麼個清除法?算法

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

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次就能夠清除了,循環引用是致命的,因此瀏覽器都拋棄了引用計數法spa

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清除下)事件未清理code

相關文章
相關標籤/搜索