Node.js堆内存不足

今天我运行脚本进行文件系统索引刷新RAID文件索引,4小时后崩溃,出现以下错误:

[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内存和24GB固态硬盘交换。 我非常怀疑我的脚本超过了36GB的内存。 至less不应该

脚本创build存储为对象数组文件的索引与文件元数据(修改date,权限等,没有大数据)

以下是完整的脚本代码: http : //pastebin.com/mjaD76c3

过去我已经遇到了奇怪的节点问题,这个脚本迫使我例如。 将索引拆分成多个文件,因为当处理像String这样的大文件时,节点会出现问题。 有没有什么办法可以用巨大的数据集改善nodejs内存pipe理?

如果我没有记错的话,对于1.7 GB左右的V8内存使用情况,如果不手动增加的话,会有严格的标准限制。

在我们的一个产品中,我们在部署脚本中遵循了这个解决scheme:

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

还会有一个新的空间命令,但我读到这里: a-tour-of-v8-garbage-collection新空间只收集新创build的短期数据,旧空间包含所有应该在你的情况是最好的select。

当我尝试使用VSCode进行debugging时,遇到了这个问题,所以只需要添加这个就可以将参数添加到您的debugging设置中。

您可以将其添加到runtimeArgs中您的configuration文件的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" ] } ]} 

寻找和修复一个像memwatch的内存猪可能会有所帮助。

即使设置了–max-old-space-size,我也在为此而苦恼。

然后我意识到需要把选项–max-old-space-size放在业障脚本之前。

也最好指定两种语法 – max-old-space-size和–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

Interesting Posts