GC回收内存时的回调

224 阅读1分钟

FinalizationRegistry

// 当GC回收某块内存时的回调
const finalRegistry = new FinalizationRegistry((name) => {
    console.log(name, '被GC回收了');

    // 销毁之后deref获得的是undefined
    console.log(obj4.deref()?.name);
});

let obj1 = { name: 'obj1' },
    obj2 = { name: 'obj2' },
    obj3 = obj1,
    // WeakRef(弱引用)
    obj4 = new WeakRef(obj2);

// deref会使弱引用变成强引用
// console.log(obj4.deref().name);

finalRegistry.register(obj1, 'obj1');
finalRegistry.register(obj2, 'obj2');

// obj1本质上是重新指向了null而{}依然被obj3强引用着所以obj1以对象字面量方式声明的对象在内存中并不会被回收
obj1 = null;
// 因为obj2现在重新指向了null而obj4使用了WeakRef是弱引用了对象字面量创建出的对象地址所以会被回收
obj2 = null;
// GC回收是不定时的且从下往上回收