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