2011-09-09 150 views
28

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

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分配失败 - 加工出来的内存

+0

对于那些有兴趣,我切换到使用缓冲液。有限的成功.http://stackoverflow.com/questions/7379755/buffer-size-in-nodejs –

回答

7

它发生在我尝试访问数组时。 但获取长度不。

> 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)涉及内存使用问题。

+1

好的,所以我不是唯一的那么,呃,可以是我应该折腾到nodejs github问题列表。 –

+0

是的,我看到了这个问题,但我不认为它只是节点了。我可以崩溃谷歌浏览器以及运行该代码。叹。 –

+0

啊,谷歌浏览器也使用了node.js使用的相同的v8引擎。让我试着看看不同的实现,因为存储16,777,216个9位整数确实需要大量内存。 – ace

4

当我运行脚本,我没有得到一个内存分配错误。你的系统有多少内存?

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

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

+0

4 GB,macbook air。一定要访问address.length属性。那是它在我的地方崩溃的地方。我会补充一点。我忘了提及那部分。大声笑 –

+0

也适用于我的设置。它应该是“addresses.length”吗? – ace

+0

是的。错字。我只是看了活动监视器。如果您只需键入“地址”并让它尝试打印出阵列,那么节点的内存使用几乎从几乎没有变成几秒钟内的演出,然后就会死亡。 :(悲伤 –

21

您可以通过传递以MB为单位的--max-old-space-size=<value>来增加默认限制。

的例子将允许节点的堆使用多达4GB(4096 )的存储器:

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

4 GB实际上是4096,我试图编辑你的答案,但变化少于6个字符。 – Ido