gpt4 book ai didi

javascript - 在垃圾收集期间是否会检查持久性收集?

转载 作者:行者123 更新时间:2023-12-02 19:05:18 25 4
gpt4 key购买 nike

我在 node.js 中有一个非常大的对象集合(数百万个),我需要将它们保留在内存中以进行缓存(它们维护在多个全局哈希对象中)。每个哈希集合存储大约 750k 个键。

为了将 GC 降至最低,我想找出存储这些项目的最佳方式。将这些项目分成数百个或数千个哈希值会更好吗?我应该根本不使用哈希吗?有什么方法可以让它们完全远离堆,这样它们就不会被 GC 检查(如果是的话我会怎么做)?

最佳答案

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

但是这些年来 GC 已经取得了长足的进步。现代 GC 实现会注意到某些对象生命周期很长,并将它们放入一个特殊的“区域”,该区域很少被收集。

这到底是如何工作的完全依赖于实现;每个浏览器都会做自己的事情,通常,当新的浏览器版本发布时,这也经常会发生变化。

编辑内存布局和组织完全无关。如果不花几周时间阅读实际代码,现代 GC 真的很难详细理解。所以我现在解释的是一个非常简单的图景;真正的代码会以不同的方式工作(并且一些GC将使用完全不同的技巧来实现相同的目标)。

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

每次 GC 运行时都会访问第一个列表。仅在每次 GC 运行时考虑第二个列表。

替代实现可能会将新对象添加到“GC 列表”的顶部,并且对于每次 GC 运行,它只会检查 N 个元素。因此,长期存在的对象将在列表中向下移动,一段时间后,它们就不会每次都被检查。

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

关于javascript - 在垃圾收集期间是否会检查持久性收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com