#1。缺少 .size
属性的解决方法?
在 JavaScript 中,我以前从未使用过 WeakSet
或 WeakMap
,而且我对垃圾收集一般不太了解(我是 PHP + JS 开发人员,所以这是我第一次真正需要考虑垃圾收集)。但我认为我现在有一个很好的 WeakMap
用例。所以我想至少开始尝试一下。
我在实验中想确认的主要事情是当对象被垃圾收集时自动删除它们。如果我可以访问实例上的 WeakSet.size
/WeakMap.size
属性来检查它们的大小,那么这将很容易测试,但它们不存在于实例上“弱”版本。
如果可能的话,我猜测结果可能会有所不同,因为大小将取决于垃圾收集器是否已经运行。但这没关系,因为这些实验代码都不会在生产中使用......我只是想确认我确实了解垃圾收集和 WeakSet/WeakMap 是如何工作的。在无法测试(因此完全理解)的情况下使用此功能的想法让我非常不安,而且我担心我最终会在为时已晚(在生产中)时发现内存泄漏。
是否有任何解决方法或替代方案来处理缺少 WeakSet.size
和 WeakMap.size
...至少只是为了调试/测试/学习目的?
如果不是 .size
解决方法,是否有办法检查我的 WeakMap
集合实例的内存使用情况?这同样有用,因为这就是主要关注点。
我现在唯一能想到的就是检查整个 Node.js 进程的内存......这对我来说似乎不太可靠。
#2。 .length 是做什么用的?
此外,我对为什么 WeakSet
和 WeakMap
的类构造函数/实例原型(prototype)上有一个 .length
属性感到有点困惑>(不在您的实例上)。
根据:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
...两个页面都说 .length
是:
长度属性的值为 0。
它们真的只是一直硬编码为数字 0 吗?那有什么意义呢?
在 Google 上搜索“WeakSet.length”或“WeakMap.length”(包括精确结果的双引号)不会产生更多信息,每个结果只有大约 20 个结果,这些结果只是 MDN 页面的镜像。
最佳答案
该大小对于 WeakSet
或 WeakMap
不可用,因为它们的键只是对对象的引用,而这些是由垃圾收集器处理的。由于收集器无法(或不应该)手动控制,因此一旦这些对象不再被引用,它将在运行时的任何时刻释放它们的内存。考虑到这一点,您建议实现一种查看其当前大小的方法的解决方法不会有效,也不建议这样做。
length
之所以存在,是因为 WeakSet
和 WeakMap
都是通过其原型(prototype)对应项创建的。考虑到收集器将如何在任何时候清除对象引用,
至于对它们进行实验,您可以在 Chrome 中尝试它们并公开垃圾收集器(并手动调用它)以查看 WeakMap 在对象引用丢失后如何清除自身(在 this 答案中进行了解释)。否则,您可能仍然会在 WeakMap
或 WeakSet
中看到引用,因为 devtools 通常会阻止垃圾收集器运行。
关于javascript - 当 .size 不存在时,尝试在 Node.js 中从 WeakSet/WeakMap 自动删除项目(通过垃圾回收)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693585/