如何监听垃圾回收

直接上结论吧, 使用的就是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 天前
仙盟创梦IDE-集成开发测试:自动解析驱动的多线路自动化测试
前端·测试自动化·仙盟创梦ide·东方仙盟
紫雾凌寒1 天前
【 HarmonyOS 高频题】2026 最新 ArkUI 开发与组件面试题
ui·华为·面试·程序员·职场发展·harmonyos·ark-ui
天天睡大觉1 天前
python命名规则(PEP8编码规则)
开发语言·前端·python
2501_944521591 天前
Flutter for OpenHarmony 微动漫App实战:底部导航实现
android·开发语言·前端·javascript·redis·flutter·ecmascript
奔跑的web.1 天前
npm install发生了什么?
前端·npm·node.js
zhengxianyi5151 天前
npmjs切换淘宝镜像
前端·npm·npm安装源
运筹vivo@1 天前
BUUCTF: [SUCTF 2019]EasySQL
前端·web安全·php
holeer1 天前
14步入门Vue|cn.vuejs.org教程学习笔记
前端·javascript·vue.js·笔记·前端框架·教程·入门
是席木木啊1 天前
RuoYi-Vue-Plus UI前端页面布局调整
前端·vue.js·ui