首页 > 解决方案 > 当 .size 不存在时,在 Node.js 中尝试从 WeakSet/WeakMap(通过垃圾收集)自动删除的项目?

问题描述

#1。缺乏.size财产的解决方法?

在 JavaScript 中,我从来没有使用过任何一种WeakSetWeakMap以前,而且我对垃圾回收的了解也不多(我是一名 PHP + JS 开发人员,所以这是我第一次真正需要考虑垃圾收藏)。但我认为我现在有一个很好的用例WeakMap。所以我想至少开始尝试它。

我想在我的实验中确认的主要事情是当对象被垃圾收集时自动删除它们。WeakSet.size如果我可以访问实例上的/属性来检查它们的大小,这将很容易测试WeakMap.size,但它们在“弱”版本中不存在。

如果可能的话,我猜测结果可能会有所不同,因为大小将取决于垃圾收集器是否已经运行。但这没关系,因为这些实验代码都不会在生产中使用……我只是想确认我确实了解垃圾收集和 WeakSet/WeakMap 是如何工作的。在无法测试(因此完全理解)的情况下使用此功能的想法让我非常不安,我担心我最终会在为时已晚时发现内存泄漏(在生产中)。

是否有任何解决方法或替代方法来处理缺少WeakSet.sizeWeakMap.size...至少仅用于调试/测试/学习目的?

如果不是.size解决方法,是否有办法检查我的WeakMap集合实例的内存使用情况?这将同样有用,因为这是主要关注点所在。

我现在唯一能想到的就是检查整个 Node.js 进程的内存......这对我来说似乎不太可靠。

#2。.length 有什么用?

此外,我对为什么.length在两者的类构造函数/实例原型上都有一个属性WeakSet以及WeakMap(而不是在它们的实例上)有点困惑。

根据:

...两页都说.length是:

他们真的只是一直硬编码为数字 0 吗?那有什么意义呢?

在 Google 上搜索“WeakSet.length”或“WeakMap.length”(包括精确结果的双引号)不会产生更多信息,每个结果只有大约 20 个,这只是 MDN 页面的镜像。

标签: javascriptnode.jsgarbage-collectionweak-referencesweakmap

解决方案


大小将不可用,WeakSet或者WeakMap因为它们的键只是对对象的引用,并且这些由垃圾收集器处理。由于收集器无法手动控制(或不应该),因此一旦不再引用这些对象,它将在运行时的任何时间释放这些对象的内存。您建议实施一种查看其当前大小的方法的解决方法无效,也不建议考虑这一点。

length因为两者都存在,并且WeakSetWeakMap通过它们的原型对应物创建的。鉴于收集器将如何在任何时候清除对象引用,

至于对它们进行实验,您可以在 Chrome 中试用它们并公开垃圾收集器(并手动调用它)以查看 WeakMap 在对象引用丢失后如何清除自身(在答案中解释)。否则,您可能仍会在WeakMapor中看到该引用,WeakSet因为 devtools 通常会阻止垃圾收集器运行。


推荐阅读