如何监听垃圾回收

直接上结论吧, 使用的就是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

相关推荐
橙子家5 小时前
浏览器缓存之【身份与会话管理】:Cookies 和 Private state tokens
前端
最新资讯动态6 小时前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态6 小时前
游戏出海,从产品走向体系
前端
最新资讯动态6 小时前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态6 小时前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝8 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen8 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒9 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
徐小夕10 小时前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
一份执念10 小时前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序