javascript - 当 .size 不存在时,尝试在 Node.js 中从 WeakSet/WeakMap 自动删除项目(通过垃圾回收)?

标签 javascript node.js garbage-collection weak-references weakmap

#1。缺少 .size 属性的解决方法?

在 JavaScript 中,我以前从未使用过 WeakSetWeakMap,而且我对垃圾收集一般不太了解(我是 PHP + JS 开发人员,所以这是我第一次真正需要考虑垃圾收集)。但我认为我现在有一个很好的 WeakMap 用例。所以我想至少开始尝试一下。

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

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

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

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

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

#2。 .length 是做什么用的?

此外,我对为什么 WeakSetWeakMap 的类构造函数/实例原型(prototype)上有一个 .length 属性感到有点困惑>(不在您的实例上)。

根据:

...两个页面都说 .length 是:

  • 长度属性的值为 0。

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

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

最佳答案

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

length 之所以存在,是因为 WeakSetWeakMap 都是通过其原型(prototype)对应项创建的。考虑到收集器将如何在任何时候清除对象引用,

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

关于javascript - 当 .size 不存在时,尝试在 Node.js 中从 WeakSet/WeakMap 自动删除项目(通过垃圾回收)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693585/

相关文章:

javascript - 在 Node.js 中循环使用 findOne 需要太长时间

node.js - 使用多个字段表达 app.get

node.js - 如何更新 Mongoose 中的记录

java - HashMap.remove 和垃圾回收

java - 重写Object类的finalize()方法有什么用?

javascript - 使用 Javascript 更改表格中的文本

javascript - 在显示新数据之前清除

php - Facebook API+设置密码和用户名+PHP

javascript - 使用数组中的文本向 SVG 元素添加工具提示

java - 当子对象引用父对象时对象销毁