如何验证FinalizationRegistry的GC回调触发?Chrome代码无输出排查
关于FinalizationRegistry的常见问题解答
1. 如何确认FinalizationRegistry确实会在对象被垃圾回收器回收时调用指定的回调函数?
- 核心前提:确保被注册的对象没有任何可达引用,垃圾回收器仅会回收不可达对象。
- 验证步骤:
- 打开Chrome开发者工具的Memory面板;
- 运行注册对象的代码后,手动解除对象的所有引用(如将变量赋值为
null); - 点击Memory面板的「强制垃圾回收」按钮(垃圾桶图标);
- 观察控制台是否输出回调内容,同时可通过前后内存快照对比,确认对象已被回收。
- 注意:FinalizationRegistry的回调执行时机由浏览器调度,无法保证精确性,不能依赖它实现关键的资源释放逻辑。
2. 代码运行后未输出预期信息的问题排查
你提供的代码中,obj变量始终保持着对目标对象的可达引用,垃圾回收器不会回收仍有引用的对象,因此回调无法触发。
修改后的代码示例
let obj = {}; // 使用let而非const,便于后续解除引用 const registry = new FinalizationRegistry(value => { console.log(value); }); registry.register(obj, 'Garbage collected'); obj = null; // 解除对象的引用,使其变为不可达
额外操作建议
- 开发者控制台可能会额外持有变量引用,可将代码放在IIFE中执行,避免全局上下文的影响:
(function() { let obj = {}; const registry = new FinalizationRegistry(value => { console.log(value); }); registry.register(obj, 'Garbage collected'); obj = null; })();
- 手动触发垃圾回收:打开Chrome开发者工具的Memory面板,点击垃圾桶图标强制执行GC,回调会在GC完成后异步触发,需稍作等待。
内容的提问来源于stack exchange,提问作者Trident D'Gao
相关产品推荐
相关产品推荐

