在网络的很多地方,你会看到:
节点进程的内存限制是什么?
和答案:
目前,默认情况下,V8在32位系统上的内存限制为512mb,在64位系统上的内存限制为1GB。通过将--max-old-space-size设置为最大~1gb(32位)和~1.7gb(64位)可以提高限制,但建议您将单个进程分成几个工作程序如果你达到内存限制。
有人可以确认这是因为Node.js似乎经常更新吗?
更重要的是,在不久的将来会出现这种情况吗?
我想编写可能需要处理4gb javascript对象的JavaScript代码(速度可能不是问题)。
如果我不能在Node中这样做,我最终会在java(在64位机器上)上做,但我宁愿不这样做。
答案 0 :(得分:21)
对于一些使用Node.js的人来说这是一个很大的问题,并且有好消息。对于64位,V8的新内存限制现在是未知的(未经测试),并且在32位环境中可以提升到32位地址空间。
答案 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)
如果您使用os.arch() === 'ia32'
运行Node.js,则可以设置的最大值为 3049
根据我对节点v11.15.0和Windows 10的测试
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