Node.js减少V8垃圾回收器内存使用量

15

我正在使用 util 模块来调试一个 Node.js 应用程序,heapUsed 值保持在 30-100MB 左右,而 heapTotal 的值增长到了 1.4GB。

这里有一个类似行为的问题:链接

我已经了解到这是 v8 垃圾回收器的工作方式,但问题是如果在 512 MB 的设备上运行,如何减少它分配的内存量(使其小于 1.4GB)。

1个回答

33

您需要控制最大内存大小标志(所有大小以MB为单位)。

“低内存设备”的推荐数量如下

node --max-executable-size=96 --max-old-space-size=128 --max-semi-space-size=1 app.js

适用于32位和/或Android

node --max-executable-size=192 --max-old-space-size=256 --max-semi-space-size=2 app.js

适用于64位的非Android操作系统。

这些将限制堆总量分别为225mb和450mb。它不包括JS外部的内存使用。例如,缓冲区被分配为"c内存",而不是JavaScript堆中的内存。

此外,您应该知道,越接近堆限制,垃圾回收所花费的时间就越多。例如,如果您的内存使用率达到95%,则90%的CPU将用于进行垃圾回收,而10%用于运行实际代码(数字不准确,但给出了一般想法)。因此,您应该尽可能慷慨地设置限制,永远不要超过最大内存使用量的16%,即 heapUsed/limit 不应大于 0.16 。 16%只是我从某篇论文中记得的一个数字,可能不是最优的。

标志:

  • --max-executable-size 为可执行代码(即时编译的JavaScript生成的本机代码)保留的最大堆大小。
  • --max-old-space-size 为长期对象保留的最大堆大小
  • --max-semi-space-size 为短期对象保留的最大堆大小

@Herokiller 哪些数字? - Esailija
1
我不明白你的问题,整个重点是使用标志来减少v8用于js的总内存。 - Esailija
1
请问您能解释一下标志(flags)的含义吗? - Sagar
1
请解释一下这些标志的作用和目的,否则你的回答是不完整的。 - losnir
2
@Esailija,现在对于那些来自Google并且没有关于V8内存管理/GC背景的人来说,情况更加清晰了。+1 - losnir
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接