如何监听垃圾回收

直接上结论吧, 使用的就是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 小时前
Vue项目解决跨域
前端·javascript·vue.js
唐青枫1 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
网安蟹佬霸2 小时前
OSINT开源情报收集实战:从信息搜集到资产测绘(2026最新万字保姆级指南)
前端·网络·安全·web安全·网络安全·开源
单线程_012 小时前
【源码阅读】Vue3 Tokenizer 词法分析器完整状态机流转深度梳理(3.4+ 新版架构)
前端
PBitW2 小时前
PM 丢来 3 个 Excel、12 个功能、4 种情形?用 TRAE Work 30 分钟整理成前端开发文档
前端·trae
码匠许师傅3 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
风骏时光牛马5 小时前
AIAgent高可用架构:弹性容错与故障自愈的落地实践
前端
IT_陈寒5 小时前
Vue的响应式什么时候会失灵?这个坑我踩了
前端·人工智能·后端
烟锁池塘柳05 小时前
解决 Firefox 浏览器网页文本选中高亮不明显问题(含仅修改特定网站高亮显示的方案)
前端·firefox
Patrick_Wilson5 小时前
Web 认证方案技术指南
前端·后端·面试