如何监听垃圾回收

直接上结论吧, 使用的就是FinalizationRegistry 这个构造函数

FinalizationRegistry 是 JavaScript 中的一个高级特性,它允许你在一个对象被垃圾回收时注册一个回调函数。这个特性是 ES2021(即 ECMAScript 2021)引入的一部分,属于 JavaScript 语言的一个扩展。

作用

FinalizationRegistry 的主要用途是允许开发者在对象被垃圾回收时执行一些清理工作,如释放资源、清理缓存等。需要注意的是,FinalizationRegistry 的使用场景相对较少,且应该非常谨慎地使用,因为它与垃圾回收的时机相关,而这个时机是不确定的。

使用方法

你可以创建一个 FinalizationRegistry 实例,并为其提供一个回调函数。当注册到该 FinalizationRegistry 的对象被垃圾回收时,该回调函数会被调用。

javascript 复制代码
const registry = new FinalizationRegistry((heldValue) => {
  // 在对象被垃圾回收时执行的清理操作
  console.log(heldValue + ' 被垃圾回收了');
});

{
  const obj = {};
  // 注册对象到 FinalizationRegistry 实例
  // obj 是需要被监视的对象,当它被回收时回调函数会被执行
  // 'obj' 是一个标识,会在回调中使用,以帮助识别被回收的对象
  registry.register(obj, 'obj');
}
// 注意这里,并不会马上就会 被回收,因为垃圾回收的时机本身是不确定的
// 当 obj 退出作用域并被垃圾回收时,回调函数会被执行

注意事项

并不会马上被回收♻️

  • FinalizationRegistry 和与之相关的操作(如注册和取消注册对象)应谨慎使用,因为它们可能会导致不可预测的行为,尤其是与垃圾回收的时机有关。
  • 回调函数的执行是异步的,并且不保证一定会执行。因为 JavaScript 的垃圾回收时机是不确定的,而且在某些情况下,如果页面关闭或浏览器崩溃,回调可能永远不会被调用。
  • 不要在回调函数中保持对预期被垃圾回收对象的引用,这会导致该对象无法被回收,产生内存泄漏。
  • FinalizationRegistry 主要用于清理和资源释放等边缘情况,平时开发中应优先考虑使用更明确和直接的资源管理方式。

我们可以手动触发垃圾回收。

总的来说,FinalizationRegistry 提供了一种机制,让你可以在对象被垃圾回收时得到通知并执行一些操作。可以帮助我们很好的理解垃圾回收的原理,在特定情况下可以去更好的 查看我们所关心的对象有没有被回收。

文献

MDN

相关推荐
不正经学生10 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
ℋᙚᵐⁱᒻᵉ鲸落2 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
默_笙4 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
怕浪猫4 小时前
AI Agent 的安全围栏:DeepSeek Harness 沙箱隔离策略全解析
面试·agent·产品经理
前端snow5 小时前
ai agent --- 实现 openclaw 定时间效果
前端
码云之上5 小时前
换模型之后,Chatbot 为什么要自己做 compact?
前端·agent·前端工程化
星栈5 小时前
自定义 UI-UX-Pro-Max 的 CSV 知识库,把 AI 生成的后台拉回行业该有的样子
前端·agent·weui
研☆香6 小时前
简单的图片上传 删除 预览
前端
ITresearchGuest6 小时前
我用 AI 一小时写了一个世界杯数据可视化平台|前端 VibeCoding 初体验
前端·人工智能·信息可视化
丰锋ff6 小时前
面试问题合集
面试·职场和发展