在垃圾收集期间是否检查持久收集

Will a persistent collection be examined during garbage collection?

本文关键字:检查 是否      更新时间:2023-09-26

我在node.js中有一个非常大的对象集合(数百万),我需要将其保存在内存中用于缓存目的(它们维护在几个全局哈希对象中)。每个散列集合存储大约750k个键。

为了将GC保持在最低限度,我想找到存储这些项的最佳方法。将这些项拆分为数十万个哈希会更好吗?我是不是应该完全不用哈希?是否有办法使它们完全远离堆,这样GC就永远不会检查它们(如果有的话,我该怎么做)?

没有公共API来控制JavaScript的垃圾收集。

但是这些年来GC已经走了很长一段路。现代GC实现会注意到一些对象的寿命很长,并将它们放入一个特殊的"区域",该区域将很少被收集。

这究竟是如何工作的完全取决于实现;每个浏览器都有自己的功能,通常,当新版本发布时,这也会发生变化。

EDIT内存布局和组织是完全无关的。如果不花几周时间阅读实际代码,就很难理解现代gc的细节。所以我现在解释的是一个非常简化的图;实际代码的工作方式会有所不同(有些gc会使用完全不同的技巧来实现相同的目标)。

假设GC对每个对象都有一个计数器,用来计算它在过去看到它的频率。此外,它还有几个列表,其中保存了不同年龄的对象,即计数器超过特定阈值的对象。因此,当计数器达到某个限制时,对象被移动到下一个列表。

每次GC运行时访问第一个列表。第二个列表只在每次第n次GC运行时考虑。

另一种实现可能会将新对象添加到"GC列表"的顶部,并且对于每次GC运行,它只检查N个元素。所以长时间存在的对象会移到列表的下端,过一段时间后,它们就不会每次都被检查了。

这对你来说意味着你不需要做任何事情;GC会发现你的大映射存在了很长时间(对于映射中的所有对象都是如此),过了一段时间,它会开始忽略这个数据结构。