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 RAM 和 24gb SSD 交换。我非常怀疑我的脚本超过了 36gb 的内存。至少不应该

脚本使用文件元数据(修改日期、权限等,无大数据)创建存储为对象数组的文件索引

这是完整的脚本代码:

http://pastebin.com/mjaD76c3

我过去已经用这个脚本经历过奇怪的节点问题,这迫使我例如。将索引拆分为多个文件,因为节点在处理像 String 这样的大文件时出现故障。有什么方法可以通过庞大的数据集改善 nodejs 内存管理?

原文由 Lapsio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

如果我没记错的话,V8 中的内存使用量有一个严格的标准限制,大约是 1.7 GB,如果你不手动增加它的话。

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

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

还有一个新的空间命令,但正如我在这里读到的: a-tour-of-v8-garbage-collection 新空间只收集新创建的短期数据,旧空间包含所有引用的数据结构,这些数据结构应该在你的情况是最好的选择。

原文由 Felix 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你想全局增加节点的内存使用 - 不仅仅是单个脚本,你可以导出环境变量,如下所示:

export NODE_OPTIONS=--max_old_space_size=4096

然后你不需要在运行像 npm run build 这样的构建时玩文件。

原文由 Maksim Luzik 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题