当不存在.size时,如何通过Node.js中的WeakSet / WeakMap(通过垃圾回收)自动删除项目进行实验?

问题描述 投票:2回答:1

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

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

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

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

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

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

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

#2。 .length是什么?

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

根据:

...两页都说.length是:

  • The value of the length property is 0.

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

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

javascript node.js garbage-collection weak-references weakmap
1个回答
0
投票

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

length在那里,因为WeakSetWeakMap都是通过它们的原型对应对象创建的。鉴于收集器将如何随时清除对象引用,

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

© www.soinside.com 2019 - 2024. All rights reserved.