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

Posted

技术标签:

【中文标题】Node.js(和 chrome V8)中的内存限制【英文标题】:memory limit in Node.js (and chrome V8) 【发布时间】:2011-11-03 20:53:19 【问题描述】:

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

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

以及答案:

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

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

更重要的是,在不久的将来会是这样吗?

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

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

【问题讨论】:

到底有什么东西会占用 4GB 的 JS 对象? @dominic-barnes:图片。电影。咳咳,有关系吗?总有一天会的。以 MMORPG 为例。我同意这些限制是残酷的,在 v8 的原始草案中使用 32 位整数进行寻址是一个严重的程序员错误。 你说:“如果你想拥有 4gb 的数据,你不能作为 JS 对象来做。”如果那句话是真的(并且会持续一段时间),我认为 nodejs 都是炒作。因此,我希望你是错的。 我在 nodejs 对象中轻松移动了 8GB 左右,仅供参考。我认为自从提出这个问题以来,过去几年发生了很多变化。 只要您流式传输数据,就没有内存限制。读写流是一种很棒的设计模式,它可以帮助您做您需要的事情,而不会耗尽 V8 内存。 【参考方案1】:

看起来是真的。当我试图在缓冲区中分配 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 的内存。

【讨论】:

【参考方案2】:

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

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

查看node command line options documentation 或运行:

node --help --v8-options

【讨论】:

这里有更多相关信息:the-data-wrangler.com/nodejs-memory-limits【参考方案3】:

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

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

在我使用 node v11.15.0 和 windows 10 进行测试时

如果设置为 3050,则会溢出,等于设置为 1。 如果设置为 4000,则等于设置为 51 (4000 - 3049) 将 Node.js 的内存设置为最大值
node --max-old-space-size=3049
使用 TypeScript 将 Node.js 的内存设置为最大值
node -r ts-node/register --max-old-space-size=3049

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

【讨论】:

【参考方案4】:

我现在在 Ubuntu linux 上运行一个 proc,它有明确的内存泄漏,并且节点 0.6.0 正在推送 8gb。认为它已经处理好了:)。

【讨论】:

【参考方案5】:

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

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

【讨论】:

我仍然(即使是 64 位)需要使用 --max-old-space-size=10000(对于 10GB)选项指定我想要更多内存,否则我会得到“致命错误:CALL_AND_RETRY_2分配失败 - 进程内存不足”在 Windows 上的任务管理器中内存使用量约为 1.7GB。 我在 v7.8.0 中轻松使用 8gb+ - 只希望我的机器有更多内存 链接失效

以上是关于Node.js(和 chrome V8)中的内存限制的主要内容,如果未能解决你的问题,请参考以下文章

没有 v8-profiler 的 Node.js 内存泄漏搜索

如何将 Node.js V8 分析信息导出到 Chrome 的开发工具性能配置文件?

深入理解Node.js垃圾回收与内存管理

Node.js背后的V8引擎优化技术

Node.js背后的V8引擎优化技术

新 V8 即将推出和 Node.js