Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何确定正确的;“最大旧空间大小”;对于node.js?_Node.js_Memory_V8 - Fatal编程技术网

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

我如何确定正确的;“最大旧空间大小”;对于node.js?,node.js,memory,v8,Node.js,Memory,V8,我很难理解Node.js是如何基于参数max old space size工作的 例如,在我的例子中,我正在运行两个t2.smallAWS实例(2GB的RAM) 不知道为什么,但我确实设置了max old space size=4096(4GB)。在这种情况下,node做什么?此配置是否可能导致内存分配失败 如何根据服务器资源确定max old space size的正确值 我的应用程序不断增加内存使用量,我试图了解节点内部的所有信息。旧空间是V8托管(也称为垃圾收集)堆(即JavaScript

我很难理解Node.js是如何基于参数
max old space size
工作的

例如,在我的例子中,我正在运行两个
t2.small
AWS实例(2GB的RAM)

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

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

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

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

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


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

当分配给执行应用程序的内存小于所需内存时,会发生此错误。 默认情况下,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

2020年更新 这些选择是可行的。对于2GB计算机,您可能应该使用:

NODE_OPTIONS=--max-old-space-size=1536
确定使用量:您可以使用
free-m
查看Linux机器上的可用内存。注意,您可以考虑“<代码>免费< /代码>和<>代码>缓冲区/缓存>代码>内存可用,如<>代码>缓冲区/缓存>代码>可以在需要时立即丢弃(这些缓冲区和缓存是使用未使用内存的好方法)。 注意,报告还提到:

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


因此,上述值为零。考虑到基本OS所需的内存量不会有太大的变化,所以你可以在4GB的机器上愉快地做3.5次。

这正是我希望得到的答案,描述了系统或节点内存不足的边缘情况。@ JMRK:看来你是完全正确的,但是当我使用2GB RAM和4GB交换和设置时,你是完全正确的。“--max old space size”到4GB,然后节点进程将消耗所有RAM内存并停留在1.9GB上。问题是“为什么要避免使用交换?”??“(节点版本8.11.1)该标志应覆盖任何其他内容。请仔细检查拼写错误。从
d8--help
--max old space size(旧空间的最大大小(以MB为单位))
我现在添加了一条评论,因为我发现这会让视图变得安静很多。我花了整整一周的时间才意识到我的NodeJS应用程序没有内存泄漏,但垃圾收集器从未启动。请注意,在内存较低的系统上,如t2.micro或t2.small实例。服务器会因为不可用的RAM而崩溃。是不是有办法让垃圾收集器启动吗?@Borjante垃圾收集器为什么没有运行?配置的最大旧空间大小比机器的RAM总量有一个更高的限制。值得尝试
--优化大小
,以减少内存使用。它应该超过分配的RAM内存。我不确定这是否正确更多。当然,在一个系统上,我可以访问运行Node10.20.1的节点,我可以看到(使用
节点--v8选项
)默认报告为4096,没有设置
max old space size
,我正在运行的测试套件可以轻松地分配到1.5Gb。链接的中间文章是2016年的,因此自它被编写以来,事情可能已经有所进展。很难找到这方面的佐证;我在V的文档中找不到任何明确的内容8或Node。我拥有的另一个系统报告了v10、12和14的默认值。作为0.FWIW,我发现了两位最近的博主,他们说最大内存为1.5Gb(),v12有一个基于系统的动态最大内存()。
Node-e“console.log(`Node heap limit=${require('v8').getHeapStatistics().heap\u size\u limit/(1024*1024)}Mb`)“
->v12.18.0和v14.3.0->2096Mb,v10.20.1->1432Mb@JaySeeAre,感谢您使用该命令显示堆大小限制。对于一个普通的UNIX外壳,它需要引用不同的代码:<代码>节点-e控制台.log('节点堆限制=${Value'(“V8”).GeTeaPosialStices().HeAPxsisix限制(/(1024×1024)} MB′)<代码>从NoDE.js文档中共享的链接中,它说:“在一台2GB内存的机器上,考虑将其设置为1536(1.5 GB)”。谢谢@IdanDagan,我会在答案中加上这个。吹毛求疵:这里没有理由喜欢“整数”。1535、1537、1500或1555也一样好。这是真的,但因为内存是以字节为单位的,所以我们只选取了这些字节的四分之一(除了NUMA/缓存一致性等性能概念)。