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

时间:2011-08-25 16:30:27

标签: memory-management node.js

在网络的很多地方,你会看到:

  

节点进程的内存限制是什么?

和答案:

  

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

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

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

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

如果我不能在Node中这样做,我最终会在java(在64位机器上)上做,但我宁愿不这样做。

6 个答案:

答案 0 :(得分:21)

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

在此处阅读更多内容:http://code.google.com/p/v8/issues/detail?id=847

答案 1 :(得分:5)

我现在正在Ubuntu linux上运行proc,它有明确的内存泄漏,节点0.6.0正在推动8gb。认为这是处理:)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

  

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

答案 4 :(得分:1)

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

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

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

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

如果我们花时间将应用程序拆分为较小的微服务,那么大多数内存限制都没有问题。

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

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

答案 5 :(得分:0)

对于32位用户,

内存限制最大值为 3049

如果您使用os.arch() === 'ia32'运行Node.js,则可以设置的最大值为 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