2016-07-25 72 views
53

今天我跑我的文件系統索引刷新RAID文件索引腳本和4h後,用下面的錯誤崩潰:Node.js的堆內存不足

[md5:] 241613/241627 97.5% 
[md5:] 241614/241627 97.5% 
[md5:] 241625/241627 98.1% 
Creating missing list... (79570 files missing) 
Creating new files list... (241627 new files) 

<--- Last few GCs ---> 

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9/0 ms [allocation failure] [GC in old space requested]. 
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9/0 ms [allocation failure] [GC in old space requested]. 
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5/0 ms [last resort gc]. 
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6/0 ms [last resort gc]. 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 0x3d1d329c9e59 <JS Object> 
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n >) 
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin... 

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 
1: node::Abort() [/usr/bin/node] 
2: 0xe2c5fc [/usr/bin/node] 
3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node] 
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node] 
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node] 
6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node] 
7: 0x3629ef50961b 

服務器配備了16GB的RAM和24GB SSD交換。我非常懷疑我的劇本超過36GB的記憶。至少它不應該

腳本創建存儲爲文件元數據對象的數組文件的索引(修改日期,權限等,沒有什麼大的數據)

下面是完整的腳本代碼: http://pastebin.com/mjaD76c3

我已經經歷過奇怪的節點問題,這個劇本強迫我如此。將索引拆分爲多個文件,因爲在處理像String這樣的大文件時節點出現故障。有沒有什麼方法可以用巨大的數據集改善nodejs內存管理?

回答

86

如果我沒有記錯的話,對於1.7 GB左右的V8內存使用情況有一個嚴格的標準限制,如果你不手動增加它的話。

在我們的產品中,我們遵循我們的部署腳本此解決方案:

node --max-old-space-size=4096 yourFile.js 

有也將是一個新的空間的命令,但我在這裏閱讀:a-tour-of-v8-garbage-collection新的空間只收集新創建的短期長期數據和舊空間包含所有引用的數據結構,這些數據結構應該是您的最佳選擇。

+0

如何設置全局? – aufula

+0

你不能@aufula –

+0

如果我使用Express框架,在哪裏設置? – Simer

8

我試圖用VSCode進行調試時遇到了這個問題,所以只想添加這個就是你可以添加參數到你的調試設置。

您可以將其添加到launch.json的配置的runtimeArgs屬性中。

請參閱下面的示例。

{ 
"version": "0.2.0", 
"configurations": [{ 
     "type": "node", 
     "request": "launch", 
     "name": "Launch Program", 
     "program": "${workspaceRoot}\\server.js" 
    }, 
    { 
     "type": "node", 
     "request": "launch", 
     "name": "Launch Training Script", 
     "program": "${workspaceRoot}\\training-script.js", 
     "runtimeArgs": [ 
      "--max-old-space-size=4096" 
     ] 
    } 
]} 
2

即使在設置--max-old-space-size之後,我仍然爲此苦苦掙扎。

然後我意識到需要將選項--max-old-space-size放在業障腳本之前。

也最好--max歲的空間尺寸同時指定語法和--max_old_space_size我的腳本因緣:

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192 --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192 --prod --aot 

參考https://github.com/angular/angular-cli/issues/1652

3

FWIW,發現和修復內存豬用像memwatch可能會有所幫助。

-2

嘗試運行此命令:

npm rebuild grpc 
+0

這並沒有真正回答這個問題。如果您有不同的問題,可以通過單擊[提問](https://stackoverflow.com/questions/ask)來提問。您可以[添加賞金](https://stackoverflow.com/help/privileges/set-bounties)在您擁有足夠的[聲譽](https://stackoverflow.com/help/)後吸引更多關注此問題什麼聲譽)。 - [來自評論](/ review/low-quality-posts/18328757) – Rabbid76

1

節點升級到最新版本。我在6.6節點出現這個錯誤,並升級到8.9.4,問題就消失了。