我很难理解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,以留出一些内存用于其他用途并避免交换.
mik*_*ana 57
这些选项现在由 node 正式记录。对于 2GB 的机器,您可能应该使用:
NODE_OPTIONS=--max-old-space-size=1536
Run Code Online (Sandbox Code Playgroud)
您可以使用free -m. 请注意,您可以将总内存free和buffers/cache内存视为可用,因为buffers/cache可以在需要时立即丢弃(这些缓冲区和缓存是使用其他未使用内存的好方法)。
在具有 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)
小智 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
自动确定正确的 --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
| 归档时间: |
|
| 查看次数: |
29384 次 |
| 最近记录: |