如何确定 node.js 的正确“最大旧空间大小”?

新手上路,请多包涵

我在理解 Node.js 如何根据参数 max-old-space-size 的行为时遇到了一些麻烦。

例如,就我而言,我正在运行两个 t2.small AWS 实例(2GB RAM)。

不知道为什么,但我确实设置了 max-old-space-size=4096 (4GB)。在这种情况下节点会做什么?这种配置会导致可能的内存分配失败吗?

如何根据服务器资源确定 max-old-space-size 的正确值?

我的应用程序不断增加内存使用量,我试图了解有关节点内部的一切。

原文由 Borjante 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

“旧空间”是 V8 托管(也称为垃圾收集)堆(即 JavaScript 对象所在的位置)中最大和最可配置的部分,并且 --max-old-space-size 标志控制其最大大小。随着内存消耗接近极限,V8 将花费更多时间在垃圾收集上,以释放未使用的内存。

如果堆内存消耗(即 GC 无法释放的活动对象)超过限制,V8 将崩溃您的进程(因为缺乏替代方案),因此您不想将其设置得太低。当然,如果您将其设置得太高,那么 V8 将允许的额外堆使用可能会导致您的整个系统内存不足(并且由于缺乏替代方案而交换或终止随机进程)。

总之,在具有 2GB 内存的机器上,我可能会将 --max-old-space-size 设置为大约 1.5GB 以留出一些内存用于其他用途并避免交换。

原文由 jmrk 发布,翻译遵循 CC BY-SA 3.0 许可协议

2020年更新

这些选项 现在由 node 正式记录。对于 2GB 的机器,您可能应该使用:

 NODE_OPTIONS=--max-old-space-size=1536

确定使用量

您可以使用 free -m 查看 Linux 机器上的可用内存。请注意,您可以考虑可用的 freebuffers/cache 内存的总和,因为 buffers/cache 可以立即丢弃这些缓冲区一种使用未使用内存的好方法)。

max-old-space-size官方文档 也提到:

在内存为 2GB 的机器上,考虑将其设置为 1536 (1.5GB)

因此,上面的值。考虑到基本操作系统所需的内存量变化不大,因此您可以愉快地在 4GB 机器上执行 3.5 等等。

要注意默认值并查看更改的效果:

默认为 2GB:

 $ node

> v8.getHeapStatistics()
{
  ....
  heap_size_limit: 2197815296,
}

2197815296 是 2GB 字节。

当设置为8GB时,可以看到 heap_size_limit 变化:

 $ NODE_OPTIONS=--max_old_space_size=8192 node
Welcome to Node.js v14.17.4.
Type ".help" for more information.
> v8.getHeapStatistics()
{
  ...
  heap_size_limit: 8640266240,
  ...
}

正如@Venryx 在下面提到的,您还可以使用 process.memoryUsage()

原文由 mikemaccana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题