Node.js堆内存不足

544

今天我运行了我的文件系统索引脚本来刷新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

我以前已经遇到过这个脚本的一些奇怪的问题,例如,当处理像字符串这样大的文件时,节点会出现故障,因此我不得不将索引拆分成多个文件。有没有办法改善Node.js对大型数据集的内存管理?


6
对于Windows的命令提示符(cmd):set NODE_OPTIONS=--max-old-space-size=8192 的意思是设置Node.js进程的最大内存限制为8192 MB。 - shabarinath
有人能确认这个问题是否可能是由于 CPU 不足引起的吗?在我的情况下,我有 32GB 的 RAM,并为节点选项指定了约 11G,但只有 2 个CPU。仍然会出现 OOM。 - Rajesh Swarnkar
我在tsconfig.json的compilerOptions中添加了"memoryLimit": 4096。 这对我起了作用。 - undefined
34个回答

0

我通过在package.json文件中进行一些更改来修复了Angular的问题:

"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod --aot --build-optimizer",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
}

将您的构建更改为此,它将解决内存问题,然后运行“npm run build”以在生产模式下构建您的项目。


-1
在我的情况下,我在之前的 Node 版本上运行了“npm install”,几天后我升级了 Node 版本并为一些模块运行了“npm install”。之后我遇到了这个错误。 为了解决这个问题,我从每个项目中删除了 node_module 文件夹,并再次运行了“npm install”。 希望这可以解决问题。 注意:这只发生在我的本地机器上,并且只在本地机器上修复了。

-1
如果你的内存或RAM有限,那么请使用以下命令:

ng serve --source-map=false

它将能够启动应用程序。对于我的例子,需要16GB RAM。但我可以用8GB RAM运行。

-2
检查一下你没有在64位系统上安装32位版本的node。如果你在64位或32位系统上运行node,则nodejs文件夹应分别位于Program Files和Program Files (x86)中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接