如何监听垃圾回收

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

相关推荐
怕浪猫1 小时前
第 1 章 FDE的崛起
面试
FreeTinker2 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396232 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
wangruofeng3 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne4 小时前
WebRTC Native / Android 开发学习资源整理
前端
excel5 小时前
nuxt 3 升级 nuxt 4 报错之 hasInjectionContext
前端
何以解忧,唯有..5 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
软件聚导航6 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag
恋猫de小郭6 小时前
看懂大模型架构术语,帮助你理解目前常见的大模型开源架构
前端·人工智能·ai编程
yma166 小时前
通过提示词实现GitHub Pages 和 Nginx 双部署竟然这么简单?
前端