垃圾收集器会按期(周期性)找出那些不在继续使用的对象,而后释放其内存。浏览器
标记清除->“对象是否再也不须要”简化成“环境中的变量是否能访问到它”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
}
复制代码