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


73

在网络上的许多地方,您都会看到:

节点进程的内存限制是多少?

和答案:

当前,默认情况下,V8在32位系统上的内存限制为512mb,在64位系统上的内存限制为1gb。可以通过将--max-old-space-size设置为最大〜1gb(32位)和〜1.7gb(64位)来提高此限制,但是建议您将单个进程拆分为多个工作进程如果达到内存限制。

有人可以确认是这种情况吗,因为Node.js似乎经常更新?

更重要的是,在不久的将来会发生这种情况吗?

我想编写JavaScript代码,该代码可能必须处理4gb的javascript对象(并且速度可能不是问题)。

如果无法在Node中执行此操作,最终我将在Java(在64位计算机上)执行操作,但我宁愿不这样做。


6
到底有什么可以在JS对象中占用4GB?
多米尼克·巴恩斯

41
@ dominic-barnes:图像。电影。哎呀,这有关系吗?有一天会有所作为。例如,MMORPG。我同意这些限制是残酷的,在v8的原始草案中使用32位int进行寻址是严重的程序员错误。
Elf Sternberg,

4
您说:“如果要拥有4gb的数据,则不能将其作为JS对象。” 如果该语句是正确的(并且将保留一段时间),我认为nodejs就是大肆宣传。因此,我希望你错了。
chacko 2011年

5
我可以轻松地在nodejs对象中移动约8GB,仅供参考。自问这个问题以来,我认为在过去几年中发生了很多变化。

3
只要您流传输数据,就没有内存限制。读写流是一种很棒的设计模式,可以帮助您完成所需的工作而不会消耗V8内存。
华莱士·西德瑞(WallaceSidhrée)

Answers:


23

对于某些使用Node.js的人来说,这是一个很大的问题,并且有个好消息。V8的新内存限制现在未知(未经测试),适用于64位,并且已提高到32位环境中允许的32位地址空间。

在此处了解更多信息:http : //code.google.com/p/v8/issues/detail?id=847


5
我仍然(即使使用64位)也需要使用--max-old-space-size = 10000(对于10GB)选项指定我想要更多的内存,否则我将收到“致命错误:CALL_AND_RETRY_2分配失败-内存不足,处理” Windows上的任务管理器中的内存使用量约为1.7GB。
Andreas Reiff 2015年

1
我在v7.8.0中轻松使用8gb +-只是希望我的机器有更多的内存


6

我现在在具有确定的内存泄漏的Ubuntu Linux上运行proc,而节点0.6.0正在推送8gb。认为它已处理:)。


1

看起来像是真的。当我试图在缓冲区中分配50 Mb字符串时,var buf = new Buffer(50*1024*1024);出现致命错误FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory。我已经在进程监视器中修复了大约457 Mb的nodejs内存使用问题。


0

对于32位用户,内存限制最大值为3049

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

在我对节点v11.15.0和Windows 10的测试中

  • 如果将其设置为3050,则它将溢出并等于1。
  • 如果将其设置为4000,则等于设置为51(4000-3049)
将Node.js的Memory设置为Max
node --max-old-space-size=3049
使用TypeScript将Node.js的Memory设置为Max
node -r ts-node/register --max-old-space-size=3049

参见:https : //github.com/TypeStrong/ts-node/issues/261#issuecomment-402093879


0

Node.js有意实施微服务架构。

如果您还没有看到,请看Ryan Dahl的演讲。那是在2011年,他将Node.js推向了世界。整个谈话非常互动。最后,他试图解释一个听起来很熟悉的概念:

节点是单线程系统,仅使用1个核心。这不是问题,因为您可以启动更多的它们。模块不共享其内存。在某种程度上,在OS进程级别存在故意的限制。要进行通信,您必须打开一个套接字,序列化数据并将其发送给他们。这是一个很好的解决方案。如今,程序变得非常庞大,往往超出一台机器。您需要做的是在多台计算机之间分发程序。即使在单个计算机级别上强制执行该操作,也会强制执行支持增长的模型。-瑞安·达尔(Ryan Dahl)(2011)

“微服务”一词仅在2个月后在威尼斯的一次研讨会上提出。但是现在回头看,很明显他正在尝试解释。还没有一个词。

如果我们花时间将应用程序拆分为较小的微服务,则这些内存限制中的大多数都不成问题。

Node.js具有超快速原始TCP或HTTP通信的所有基础,但是Ryan在该视频中还强调了Node.js本身不是HTTP服务器。但是有些Node.js框架和库专门处理这些事情。

一旦达到这一点,我认为是时候看看NestJS框架了,该框架具有一些内置的微服务功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.