【问题标题】:nodejs out of memorynodejs内存不足
【发布时间】:2011-11-13 12:20:37
【问题描述】:

我今天遇到了一个奇怪的问题。这对其他人来说可能是一个简单的答案,但它让我难住了。为什么下面的代码会导致内存错误?

var cur = 167772160;
var bcast = 184549375;
var addresses = [];
while (cur <= bcast){
  cur += 1;
  addresses.push(cur);
}
addresses.length 
addresses // memory goes from a few megs to over a gig in seconds when trying to print this

我得到了这两个错误之一...第一个是当我在节点的解释器中运行此代码时,而后者是当我通过 nodeunit 运行它时:

致命错误:CALL_AND_RETRY_2 分配失败 - 进程内存不足

致命错误:JS 分配失败 - 进程内存不足

【问题讨论】:

标签: javascript node.js v8


【解决方案1】:

您可以通过传递--max-old-space-size=&lt;value&gt;(以 MB 为单位)来增加默认限制。

该示例将允许节点的堆使用高达 4GB(4096 兆字节)的内存:

node --max-old-space-size=4096 app

【讨论】:

  • 4 GBs 实际上是 4096,我尝试编辑您的答案,但更改少于 6 个字符。
【解决方案2】:

当我尝试访问数组时会发生这种情况。 但获得长度不会。

> var cur = 167772160;
> var bcast = 184549375;
> var addresses = [];
> while (cur <= bcast){
...   cur += 1;
...   addresses.push(cur);
... }
16777216
> addresses.length 
16777216
> addresses
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

这是另一个 SO 问题,memory limit in Node.js (and chrome V8),与内存使用问题有关。

【讨论】:

  • 好的,所以我不是唯一一个。唔。也许我应该把它扔到nodejs github问题列表中。
  • 是的,我之前看到了这个问题,但我不认为它只是节点了。我也可以使 google chrome 崩溃以及运行该代码。叹息。
  • 啊,谷歌浏览器也在使用与 node.js 相同的 v8 引擎。让我尝试看看不同的实现,因为存储 16,777,216 个 9 位整数确实需要大量内存。
【解决方案3】:

我在运行您的脚本时没有收到内存分配错误。您的系统上有多少 RAM?

编辑 好的,作者更新的笔记,我可以复制它。

Node 正在尝试将整个数组转换为字符串。该数组的长度为 16777216 个元素。每个元素都包含一个至少 9 位长的数字。将其转换为 150,994,994 个字符长的字符串。它只是一个超出节点内存能力的巨大操作。

【讨论】:

  • 4 GB,macbook air。请务必访问 address.length 属性。那就是它撞到我的地方。我会补充的。我忘了提到那部分。大声笑
  • 也适用于我的设置。应该是addresses.length
  • 是的。错字。我刚看了活动监视器。如果您只是键入“地址”并让它尝试打印出数组,那么节点的内存使用量会在几秒钟内从几乎为零变为超过一个演出,然后死亡。 :( 悲伤
  • 您运行的是哪个版本的节点?我在 0.4.8
  • 我开始认为是 toString 或 valueOf 方法导致了这个崩溃。我在 v8 列表中发布了一个问题,值得一看。 code.google.com/p/v8/issues/detail?id=1671 如果只有 node 支持 yield 关键字,我就不会写这样的代码了。我将不得不看看我是否可以创建一个带有回调的递归函数,它的作用就像生成器会做的那样。这样就不需要创建一个包含所有这些值的数组 b/c 我可以在程序的另一部分一个一个地处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2016-07-29
  • 2018-06-11
  • 2016-10-22
相关资源
最近更新 更多