nodejs 减少 v8 垃圾收集器内存使用

nodejs decrease v8 garbage collector memory usage

我正在使用 util 模块调试 nodejs 应用程序,而 heapUsed 值保持在 30-100MB 左右,heapTotal值增长到 1.4GB。

Here is a question about similar behaviour

我读到这是 v8 垃圾收集器的行为方式,但问题是如果 运行 在 512 MB 上,如何减少它分配的内存量(使其小于 1.4GB)例如设备

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

recommended amounts for a "low memory device" are:

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

对于 32 位 and/or Android 和

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

对于 64 位非android。

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

您还应该知道,越接近堆限制,GC 浪费的时间就越多。例如。如果您的内存使用率为 95%,则 CPU 的 90% 将用于 GC,而 10% 将用于 运行 实际代码(不是实数,但给出了总体思路)。所以你应该尽可能慷慨地设置限制,并且永远不要超过最大内存使用量的 16%(即 heapUsed/limit 不应大于 0.16)。 16% 只是我从一些论文中想起的,它可能不是最优的。

标志:

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