【知识点】JS垃圾回收机制

js垃圾回收机制

垃圾收集器会按期(周期性)找出那些不在继续使用的对象,而后释放其内存。浏览器

标记清除

依据

标记清除->“对象是否再也不须要”简化成“环境中的变量是否能访问到它”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
}
复制代码
相关文章
相关标签/搜索