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

标签 javascript node.js v8

我在 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/

相关文章:

node.js - 在 Mac 终端上找不到 jsx 命令

javascript - Node.js 和碎片化

javascript - 函数范围内与函数外声明函数的性能

javascript - 如何在不分配的情况下迭代 Javascript 映射或对象?

javascript - 图像在所有版本的 Internet Explorer 上显示不正确

javascript - 有什么方法可以在网络 worker 关闭之前执行操作吗?

node.js - Express body-parser 不解析多个路由器中间件请求

javascript - 从 Dropzone.js 中删除所有手动添加的文件?

javascript - 在 html 中强制表情符号键盘

node.js - 删除packages.json、package-lock.json 和node_modules 后,.lodash 如何继续工作?