Angular生产构建内存溢出排查求助(Node.js 16)
排查Angular生产构建(Node.js 16)内存溢出问题的方法
Node.js 16环境下构建Angular生产包时触发FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory,已调大--max-old-space-size但受GitHub Runner内存限制仍周期性失败,以下是具体排查方向:
错误日志
✔ Copying assets complete. <ul> <li>Generating index html...</li> </ul> <p><--- Last few GCs ---></p> <p>[2057:0x5803630] 298376 ms: Mark-sweep 1982.3 (2089.2) -> 1973.3 (2096.0) MB, 3538.3 / 0.1 ms (average mu = 0.481, current mu = 0.093) allocation failure scavenge might not succeed [2057:0x5803630] 301731 ms: Mark-sweep 1979.4 (2096.0) -> 1976.3 (2098.5) MB, 3287.8 / 0.1 ms (average mu = 0.305, current mu = 0.020) allocation failure GC in old space requested</p> <p><--- JS stacktrace ---></p> <p>FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory 1: 0xb090e0 node::Abort() [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 2: 0xa1b70e [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 3: 0xce1a20 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 4: 0xce1dc7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 5: 0xe99435 [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 6: 0xea90fd v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 7: 0xeabdfe v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 8: 0xe6d072 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 9: 0xe6798c v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawArray(int, v8::internal::AllocationType) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 10: 0xe67a65 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller(v8::internal::Handle<v8::internal::Map>, int, v8::internal::Handle<v8::internal::Oddball>, v8::internal::AllocationType) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 11: 0xfc0b4d v8::internal::DeoptimizationData::New(v8::internal::Isolate*, int, v8::internal::AllocationType) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 12: 0x1c19e53 v8::internal::compiler::CodeGenerator::GenerateDeoptimizationData() [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 13: 0x1c1a575 v8::internal::compiler::CodeGenerator::FinalizeCode() [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 14: 0x1ca2a31 v8::internal::compiler::PipelineImpl::FinalizeCode(bool) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 15: 0x1ca3a33 v8::internal::compiler::PipelineCompilationJob::FinalizeJobImpl(v8::internal::Isolate*) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 16: 0xd79390 v8::internal::OptimizedCompilationJob::FinalizeJob(v8::internal::Isolate*) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 17: 0xd7df4b v8::internal::Compiler::FinalizeOptimizedCompilationJob(v8::internal::OptimizedCompilationJob*, v8::internal::Isolate*) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 18: 0xda0253 v8::internal::OptimizingCompileDispatcher::InstallOptimizedFunctions() [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 19: 0xe39287 v8::internal::StackGuard::HandleInterrupts() [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 20: 0x11e5ab4 v8::internal::Runtime_StackGuardWithGap(int, unsigned long*, v8::internal::Isolate*) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node] 21: 0x15d9e59 [/opt/hostedtoolcache/node/16.20.2/x64/bin/node]
一、内存分析定位根源
本地复现构建过程,用Node调试工具抓取内存快照:
- 执行构建命令时添加
--inspect参数:node --inspect --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod - 打开Chrome浏览器输入
chrome://inspect,连接运行中的Node进程 - 切换到Memory面板,记录Allocation Sampling或Heap Snapshot,重点关注「Generating index html」阶段的内存变化,定位占用内存最高的模块或操作
二、调整Angular构建配置
修改angular.json中的生产环境构建配置,逐一验证内存变化:
- 临时关闭
buildOptimizer:将projects.xxx.architect.build.configurations.production.buildOptimizer设为false,部分场景下该优化会导致V8编译阶段内存飙升 - 关闭生产环境sourceMap:确保
sourceMap设为false,生成sourceMap会占用大量内存 - 调整chunk拆分策略:关闭
vendorChunk或commonChunk,减少并行处理的chunk数量,降低内存压力
三、排查依赖包问题
- 生成构建统计文件:
用本地webpack分析工具打开ng build --prod --stats-jsonstats.json,排查大体积第三方依赖、重复依赖 - 检查版本兼容性:Node.js 16对应Angular 12+版本,确认是否使用了存在内存泄漏问题的旧版CLI,尝试升级到对应大版本的最新补丁版
- 清理冗余依赖:用
npm ls或yarn why检查重复安装的依赖,统一依赖版本
四、代码层面排查
- 检查全局资源:确认是否引入未压缩的大图、大JSON文件,这类资源会在构建时加载到内存中
- 检查自定义构建脚本/插件:如果有自定义webpack插件或构建前脚本,排查是否存在未释放的内存引用(如全局变量缓存大量数据)
- 检查模板复杂度:查看
index.html或组件模板中是否有大量循环、插值表达式,HTML生成阶段复杂模板会占用更多内存
五、GitHub Runner环境优化
- 限制构建并发数:在GitHub Actions构建步骤中添加环境变量
NG_BUILD_CONCURRENCY=1,减少并行任务的内存占用 - 清理构建缓存:在Actions中添加步骤清理旧依赖缓存和构建产物,避免缓存堆积导致内存异常
- 临时切换Runner类型:如果允许,尝试使用更大内存的GitHub Runner(如
ubuntu-latest默认2核7G,可选择更高规格),验证是否为内存资源不足导致周期性失败
内容的提问来源于stack exchange,提问作者ppeko
相关产品推荐
相关产品推荐

