js垃圾回收機制
阿新 • • 發佈:2019-05-01
朋友 循環 不同 單點 閉包 obj 計數 outer 在一起
通過鏈接過來的朋友知道閉包存在內存不清除問題,也就是局部變量本來要自動清除的,現在不清除了,那麽這個清除是怎麽個清除法?
手動清除法:適用於閉包不用了的情況下
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)
js垃圾回收機制