垃圾收集器會按期(週期性)找出那些不在繼續使用的對象,而後釋放其內存。瀏覽器
標記清除->「對象是否再也不須要」簡化成「環境中的變量是否能訪問到它」bash
標記清除:標記清除的方式須要對程序的對象進行兩次掃描,第一次(標記)從根對象(window對象)開始掃描,被根引用了的對象標記爲不是垃圾,不是垃圾的對象引用的對象一樣標記爲不是垃圾,以此遞歸。全部不是垃圾的對象的引用都掃描完了以後。就進行第二次掃描(清除),第一次掃描中沒有獲得標記的對象就是垃圾了,對此進行回收。函數
標記和清除過程效率不高 。 標記清除以後會產生大量不連續的內存碎片。ui
引用計數->「對象是否再也不須要」簡化成「對象有沒有其餘對象引用到它」spa
只要有變量指向該對象,該對象引用計數+1 只要有變量不在指向該對象,該對象引用計數-1code
function test(){
let obj1 = { a: 1 }; // 一個對象(稱之爲 A)被建立,賦值給 obj1,A 的引用個數爲 1
let obj2 = obj1; // A 的引用個數變爲 2
}
test() //函數執行結束,obj1,obj2生命週期結束被銷燬 {a:1}引用計數爲0,內存被回收
複製代碼
function func() {
let obj1 = {};
let obj2 = {};
obj1.a = obj2; // obj1 引用 obj2
obj2.a = obj1; // obj2 引用 obj1
}
複製代碼