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

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

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

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

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

是否有任何变通方法或替代方法来解决WeakSet.sizeWeakMap.size的缺乏……至少仅出于调试/测试/学习的目的?

如果不是.size的解决方法,也许有一种方法可以检查我的WeakMap集合实例的内存使用情况吗?那将是有用的,因为这是主要关注的地方。

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

#2。长度是什么?

对于为什么.lengthWeakSet的类构造函数/实例原型上都存在WeakMap属性(而不是在您的实例上),我有些困惑。

根据:

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

  • The value of the length property is 0.

它们是否一直都是硬编码为数字0?有什么意义呢?

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

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

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

lengthWeakSet都是通过原型原型创建的,因此WeakMap就在那里。鉴于收集器将如何随时清除对象引用,

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

本文链接:https://www.f2er.com/2786608.html

大家都在问