NodeJS建议使用max-old-space-size

Bor*_*nte 40 v8 node.js

我很难理解NodeJS如何根据参数max-old-space-size行事.

以我的情况为例,我正在运行两个t2.small aws实例(2GB的RAM).

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

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

PD:我的应用程序不断增加内存使用量,我正在尝试了解节点内部的所有内容.

jmr*_*mrk 68

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

如果堆内存消耗(即GC无法释放的活动对象)超出限制,V8将使您的进程崩溃(缺少替代方案),因此您不希望将其设置得太低.当然,如果你设置得太高,那么V8允许的额外堆使用可能会导致整个系统内存不足(并且交换或杀死随机进程,因为缺少备选方案).

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

  • 这正是我希望得到的答案,它描述了系统或Node内存不足的极端情况。 (2认同)
  • @jmrk:似乎您完全正确,但是当我使用 2GB RAM 和 4GB 交换并将“--max-old-space-size”设置为 4GB 时,节点进程会消耗所有 RAM 内存并停留在 1.9GB。问题在这里“为什么要避免使用交换??”(节点版本 8.11.1) (2认同)
  • 来自`d8 --help`:`--max-old-space-size(旧空间的最大大小(以MB为单位))` (2认同)

mik*_*ana 57

2020 更新

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

NODE_OPTIONS=--max-old-space-size=1536
Run Code Online (Sandbox Code Playgroud)

确定用量

您可以使用free -m. 请注意,您可以将总内存freebuffers/cache内存视为可用,因为buffers/cache可以在需要时立即丢弃(这些缓冲区和缓存是使用其他未使用内存的好方法)。

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

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

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

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

默认为 2GB:

$ node

> v8.getHeapStatistics()
{
  ....
  heap_size_limit: 2197815296,
}
Run Code Online (Sandbox Code Playgroud)

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,
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 从您从 Node.js 文档共享的链接中,它显示:“在具有 2GB 内存的计算机上,请考虑将其设置为 1536 (1.5GB)” (2认同)
  • 吹毛求疵:这里没有理由更喜欢“整数”。1535 或 1537 或 1500 或 1555 都一样好。 (2认同)
  • 作为 `v8.getHeapStatistics()` 的替代方案,您还可以使用: `process.memoryUsage()` (如[此处所示](https://developer.ibm.com/articles/nodejs-memory-management-in -容器环境)) (2认同)
  • @mikemaccana你说默认值是2GB,但我认为默认值是基于系统总内存或其他东西的动态。例如,在总内存约为 21GB 的虚拟机上,我的“heap_size_limit”为 4345298944 或 ~4GB (2认同)

小智 38

当为正在执行的应用程序分配的内存少于所需的内存时,会发生此错误。默认情况下,Node.js 中的内存限制为 512 MB。要增加此数量,您需要设置内存限制参数—-max-old-space-size。这将有助于避免内存限制问题。

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb
Run Code Online (Sandbox Code Playgroud)

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c

  • @JaySeeAre,感谢该命令显示“heap_size_limit”。对于普通的 UNIX shell,需要以不同的方式引用: `node -e 'console.log(\`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb \`)'` (10认同)
  • `node -e "console.log(\`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb\`)"` -> v12.18.0 和 v14。 3.0 -> 2096Mb,v10.20.1 -> 1432Mb (8认同)
  • 很难找到这方面的佐证;我在 V8 或 Node.js 的文档中找不到任何明确的内容。我报告的另一个系统 v10、12 和 14 的默认值是 0。FWIW 我发现一些最近的博主将最大内存声明为 1.5Gb (http://tejom.github.io/general/nodejs/v8/ debug/2017/01/16/nodejs-and-v8.html)并且 v12 有一个基于系统的动态最大值(https://www.idginsiderpro.com/article/3257673/whats-new-in-the- nodejs-javascript-runtime.html)。 (3认同)
  • 我的项目中没有index.js 文件,请有人帮助我。 (2认同)

nik*_*ami 5

自动确定正确的 --max-old-space-size 并为内核留下一些内存。这里有一个:

一班轮解决方案

NODE_OPTIONS=--max-old-space-size=$(expr $(echo "$(free -m)" | awk '/^Mem:/ {print $2}') - 512)

输出

给定条件:我的机器的总内存为3907MB,为内核留出 512 MB,即为节点留出3395MB。在 ubuntu 23 和 Node v20 上测试。工作时不会让您头痛。

回显$NODE_OPTIONS

--最大旧空间大小=3395