2011-09-09 148 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