max_old_space_size设置为4GB,实际限制为2GB

max_old_space_size set to 4gb, actually limits to 2GB

我正在 Gentoo Linux 64 位下编写 NodeJS 6.3.1 应用程序。 在这台机器上,我通常有 9GB 的 16GB 可用内存和 49GB 的交换空间 space 几乎没有使用。

我使用以下代码来测试我的 node.js 应用程序的内存限制:

var arr = []; 
var c=0;
while(arr.push('foo')) {if (++c%100000 == 0) {console.info(process.memoryUsage());}}

运行 这个脚本没有额外的节点参数,最后的 memoryUsage 行是这样的:

{ rss: 1032232960, heapTotal: 1015185408, heapUsed: 1008680024 }

现在 运行 node.js 和 --max_old_space_size=4096,最后的 memoryUsage 行是这样的:

{ rss: 2202341376, heapTotal: 2189082624, heapUsed: 2177311480 }

现在有 8000 个限制:

{ rss: 1934946304, heapTotal: 1921712128, heapUsed: 1909919344 }

我错过了什么?如何将堆增加到 4 或 8GB?

我认为这是V8的限制。它不会在 64 位机器上使用超过 1.7 GB 的 RAM。引自常见问题解答:

Currently, by default v8 has a memory limit of 512mb on 32-bit systems, and 1gb on 64-bit systems. The limit can be raised by setting --max-old-space-size to a maximum of ~1gb (32-bit) and ~1.7gb (64-bit), but it is recommended that you split your single process into several workers if you are hitting memory limits.