Node.js(和Chrome V8)中的内存限制

92

在许多web站点中,你会看到:

Node进程的内存限制是多少?

答案如下:

目前,默认情况下,V8在32位系统上的内存限制为512mb,在64位系统上为1gb。可以通过将--max-old-space-size设置为最大约1gb(32位)和约1.7gb(64位)来提高限制,但如果你遇到内存限制,建议将单个进程分成几个worker。

有人能确认这是否是Node.js经常更新的情况吗?

更重要的是,近期是否仍然如此?

我想编写JavaScript代码,可能需要处理4gb的JavaScript对象(速度可能不是问题)。

如果无法在Node中完成,我将在java中进行(在64位机器上),但我宁愿不这样做。


9
在JavaScript对象中,什么东西可能占用4GB的空间? - Dominic Barnes
51
@dominic-barnes:图片、电影,这有什么关系吗?总会有些东西在某一天成为问题。例如一个大型多人在线角色扮演游戏。我同意限制很严格,使用32位整数地址寻址在v8原始草案中是一个严重的程序员错误。 - Elf Sternberg
5
你说:“如果你想要4GB的数据,你不能用JS对象来实现。” 如果这个说法是真的(并且在一段时间内保持不变),我认为Node.js只是炒作而已。因此,我希望你是错误的。 - chacko
6
我可以轻松地在Node.js对象中移动8GB,仅供参考。我认为自从这个问题被提出以来,过去几年发生了很多变化。 - user993683
4
只要您通过数据流传输数据,就没有内存限制。读写流是一种出色的设计模式,可以帮助您在不消耗V8内存的情况下完成所需操作。 - Wallace Sidhrée
显示剩余4条评论
5个回答

30

使用 8GB 的堆内存启动nodejs应用

node --max-old-space-size=8192 app.js

请查看Node.js命令行选项文档或运行以下命令:

node --help --v8-options

1
这是更多相关信息:http://www.the-data-wrangler.com/nodejs-memory-limits/ - Ashley Davis

29

对于一些使用Node.js的人来说,这一直是一个大问题。但现在有好消息了!V8的新内存限制已经不再受64位系统的限制(未经测试),而在32位环境中,内存限制已经提高到可以支持的最大32位地址空间。

更多信息请参见:http://code.google.com/p/v8/issues/detail?id=847


9
即使使用64位系统,我仍然需要使用--max-old-space-size=10000(10GB)选项来指定我需要更多的内存,否则在Windows任务管理器中内存使用量达到约1.7GB时,会出现“致命错误:CALL_AND_RETRY_2分配失败-进程内存不足”的提示。 - Andreas Reiff
1
我在v7.8.0中轻松使用了8GB+,只希望我的机器有更多的RAM。 - user993683
链接已损坏。 - Stav Alfi

6

我现在在Ubuntu Linux上运行一个进程,它明显存在内存泄漏问题,node 0.6.0已经使用了8GB的内存。不过我认为这个问题已经得到解决了 :)


3

32位用户的内存限制最大值为3049

如果您正在运行os.arch() === 'ia32'的Node.js,则可以设置的最大值为3049

在我的测试中,使用node v11.15.0和Windows 10

  • 如果将其设置为3050,则会溢出并等于1。
  • 如果将其设置为4000,则会等于51(4000-3049)
node --max-old-space-size=3049

node -r ts-node/register --max-old-space-size=3049

请参考:

查看:https://github.com/TypeStrong/ts-node/issues/261#issuecomment-402093879


2

看起来是真的。当我尝试在缓冲区中分配50 Mb字符串时:

var buf = new Buffer(50*1024*1024);

我遇到了一个错误:
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

同时,在进程监视器中,Node.js 的内存使用量约为457 Mb。


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