用fork()克服node.js内存限制?

时间:2015-11-08 11:39:49

标签: javascript node.js

根据我的知识,大多数node.js版本对每个进程的内存限制大约为1GB,基于以下信息:

  

目前,默认情况下,v8在32位系统上的内存限制为512MB,在64位系统上的内存限制为1.4GB。   https://github.com/nodejs/node-v0.x-archive/wiki/FAQ

这是一个旧档案,事情可能有所改善。但是,我感兴趣的是如果要使用

require('child_process').fork("newProcess.js")

有可能克服这个限制吗?

因此,创建新的V8实例将为JavaScript对象创建新的内存池。

我之所以要问的是,我找不到确切证实这种情况的可靠来源,即使文件强烈建议会出现这种情况,因为它声明:

  

这些子Node.js进程仍然是V8的全新实例。

3 个答案:

答案 0 :(得分:2)

如果我理解了你的问题,你想使用不同的内存限制(--max-old-space-size参数)fork()。默认情况下,新的nodeJS实例将从父级继承它。

但是,您可以绕过此限制将参数传递给forked()实例,如下所示:

require('child_process').fork("newProcess.js", { 
        execArgv: ['--max-old-space-size=4096']
    });)

这将分叉您的进程,但内存限制为4Gb。

答案 1 :(得分:0)

node --max-old-space-size=4096应该有用。

AFAIK的限制取决于V8的缓冲区大小。 fork()当然可以处理更大的数据,只要你不将所有数据保存在缓冲区中。

答案 2 :(得分:0)

这与Boriel的答案非常相似,但更好(IMHO)。

在环境中传递节点选项--max-old-space-size可使您直接调用“ .js”文件。

var env = Object.assign({ 'NODE_OPTIONS' : '--max-old-space-size=4096' }, process.env );
require('child_process').fork("newProcess.js", { env: env });

请注意,如果在运行原始程序时已经在使用某些节点选项,则必须将该选项与现有选项合并。