我很难理解Node.js如何基于参数max-old-space-size进行操作。例如,在我的例子中,我运行两个t2.small AWS示例(2GB的RAM)。不知道为什么,但我设置了max-old-space-size=4096(4GB)。在这种情况下节点会做什么?这种配置会导致内存分配失败吗?如何根据服务器资源确定max-old-space-size的正确值?我的应用程序不断增加内存使用,我试图了解节点内部的一切。
max-old-space-size
t2.small
max-old-space-size=4096
e5nqia271#
“旧空间”是V8的托管堆(也叫垃圾收集堆)中最大、最可配置的部分(即JavaScript对象所在的位置),--max-old-space-size标志控制着它的最大大小。当内存消耗接近极限时,V8将花费更多的时间在垃圾收集上,以释放未使用的内存。如果堆内存消耗(即GC不能释放的活动对象)超过了这个限制,V8将使进程崩溃(因为没有替代方法),所以您不希望将它设置得太低,当然,如果设置得太高,那么V8允许的额外堆使用可能会导致整个系统内存不足(因为没有替代方法,可能会交换或杀死随机进程)。总之,在一台内存为2GB的机器上,我可能会将--max-old-space-size设置为大约1.5GB,以留出一些内存供其他用途,并避免交换。
--max-old-space-size
x759pob22#
这些选项现在是按节点正式记录的。对于2GB的机器,您可能应该用途:
NODE_OPTIONS=--max-old-space-size=1536
在使用free -m的Linux机器上可以看到可用内存。注意,您可以将free和buffers/cache内存的总和视为可用内存,因为buffers/cache可以在需要时立即丢弃(这些缓冲区和缓存是使用其他未使用内存的好方法)。max-old-space-size的官方文档还提到:在具有2GB内存的计算机上,请考虑将其设置为1536(1.5GB)考虑到基本操作系统所需的内存量变化不大,所以你可以很高兴地在4GB的机器上运行3.5。
free -m
free
buffers/cache
默认值为2GB:
$ node > v8.getHeapStatistics() { .... heap_size_limit: 2197815296, }
2197815296的字节数为2 GB。当设置为8 GB时,您可以看到heap_size_limit变化:
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()
bprjcwpo3#
当分配给正在执行的应用程序的内存少于所需内存时,会发生此错误。默认情况下,Node.js中的内存限制为512 MB。要增加此值,您需要设置内存限制参数—-max-old-space-size。这将有助于避免内存限制问题。
—-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
https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c
64jmpszr4#
对我来说,当内存消耗接近2GB时,Azure函数调用在7 GB示例中终止,并显示以下错误消息。
Exception while executing function: Functions.graphql-mobile node exited with code 134 [24164:000001CE2EB5CF00] 10557962 ms: Scavenge (reduce) 2041.0 (2050.5) -> 2040.1 (2051.5) MB, 2.3 / 0.1 ms (average mu = 0.179, current mu = 0.002) allocation failure ,FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory, 3: 00007FF73E006026 node::OnFatalError+294
我通过在应用程序设置中这样设置max-old-space-size解决了这个问题
"languageWorkers:node:arguments": "--max-old-space-size=5500"
4条答案
按热度按时间e5nqia271#
“旧空间”是V8的托管堆(也叫垃圾收集堆)中最大、最可配置的部分(即JavaScript对象所在的位置),
--max-old-space-size
标志控制着它的最大大小。当内存消耗接近极限时,V8将花费更多的时间在垃圾收集上,以释放未使用的内存。如果堆内存消耗(即GC不能释放的活动对象)超过了这个限制,V8将使进程崩溃(因为没有替代方法),所以您不希望将它设置得太低,当然,如果设置得太高,那么V8允许的额外堆使用可能会导致整个系统内存不足(因为没有替代方法,可能会交换或杀死随机进程)。
总之,在一台内存为2GB的机器上,我可能会将
--max-old-space-size
设置为大约1.5GB,以留出一些内存供其他用途,并避免交换。x759pob22#
2020年更新
这些选项现在是按节点正式记录的。对于2GB的机器,您可能应该用途:
确定用量
在使用
free -m
的Linux机器上可以看到可用内存。注意,您可以将free
和buffers/cache
内存的总和视为可用内存,因为buffers/cache
可以在需要时立即丢弃(这些缓冲区和缓存是使用其他未使用内存的好方法)。max-old-space-size
的官方文档还提到:在具有2GB内存的计算机上,请考虑将其设置为1536(1.5GB)
考虑到基本操作系统所需的内存量变化不大,所以你可以很高兴地在4GB的机器上运行3.5。
要注意默认值并查看更改的效果:
默认值为2GB:
2197815296的字节数为2 GB。
当设置为8 GB时,您可以看到
heap_size_limit
变化:正如@Venryx下面提到的,您还可以使用process.memoryUsage()
bprjcwpo3#
当分配给正在执行的应用程序的内存少于所需内存时,会发生此错误。默认情况下,Node.js中的内存限制为512 MB。要增加此值,您需要设置内存限制参数
—-max-old-space-size
。这将有助于避免内存限制问题。https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c
64jmpszr4#
对我来说,当内存消耗接近2GB时,Azure函数调用在7 GB示例中终止,并显示以下错误消息。
我通过在应用程序设置中这样设置max-old-space-size解决了这个问题