Angular经常报错内存溢出停止运行的错误:JavaScript heap out of memory

120 阅读2分钟

当项目正在编译的时候,我如果修改文件再保存,项目会开始重新编译,这时候经常报错直接停止编译,报错如下:

<--- Last few GCs --->

[28816:00000254B3BAC080]  1052023 ms: Mark-sweep 4027.3 (4121.5) -> 4011.7 (4121.5) MB, 1674.5 / 0.1 ms  (average mu = 0.100, current mu = 0.022) allocation failure scavenge might not succeed
[28816:00000254B3BAC080]  1053701 ms: Mark-sweep 4027.7 (4121.5) -> 4011.6 (4122.0) MB, 1640.6 / 0.1 ms  (average mu = 0.063, current mu = 0.022) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF7F91E058F napi_wrap+109311
 2: 00007FF7F91852B6 v8::internal::OrderedHashTable<v8::internal::OrderedHashSet,1>::NumberOfElementsOffset+33302
 3: 00007FF7F9186086 node::OnFatalError+294
 4: 00007FF7F9A5150E v8::Isolate::ReportExternalAllocationLimitReached+94
 5: 00007FF7F9A3638D v8::SharedArrayBuffer::Externalize+781
 6: 00007FF7F98E081C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1516
 7: 00007FF7F98EBB5A v8::internal::Heap::ProtectUnprotectedMemoryChunks+1258
 8: 00007FF7F98E8D09 v8::internal::Heap::PageFlagsAreConsistent+2457
 9: 00007FF7F98DD931 v8::internal::Heap::CollectGarbage+2033
10: 00007FF7F98DBB35 v8::internal::Heap::AllocateExternalBackingStore+1317
11: 00007FF7F98FBF27 v8::internal::Factory::NewFillerObject+183
12: 00007FF7F962BFB1 v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+1409
13: 00007FF7F9AD9EBD v8::internal::SetupIsolateDelegate::SetupHeap+463949
14: 000003704608A1DC

最关键的应该就是这句话了:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

我基本将网络上能查到的各种方式都试了一遍,例如设置node的内存,修改package.json文件等等,发现都并没有生效。

而最后的解决方式,就是Stack Overflow上最显眼的一条,设置node的内存(数值默认是4144,我因为是16G内存所以设置的大一些):

$env:NODE_OPTIONS="--max-old-space-size=16432"

为什么我感觉没有生效呢,因为两个最主要的原因:

1.每次打开VsCode后都需要设置一次(如果VsCode一直不关,就设置一次直到下一次关闭就可以了)

因为我设置之后第二天没有设置,所以就自然没有生效了。

2.需要在项目根目录下设置,不能新建一个powershell去设置

简单来说,VsCode你在哪个地方ng serve启动项目,就在哪个地方设置,因为我之前查资料的时候项目正在运行,懒得停止之后再设置就新建了一个powershell,这样是不会生效的!

这样设置了之后项目的启动、保存之后重新编译的速度也快了非常多…