You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&lt;--- Last few GCs ---&gt;</p>
<p>[2057:0x5803630]   298376 ms: Mark-sweep 1982.3 (2089.2) -&gt; 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) -&gt; 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>&lt;--- JS stacktrace ---&gt;</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&lt;v8::internal::Factory&gt;::AllocateRawArray(int, v8::internal::AllocationType) [/opt/hostedtoolcache/node/16.20.2/x64/bin/node]
10: 0xe67a65 v8::internal::FactoryBase&lt;v8::internal::Factory&gt;::NewFixedArrayWithFiller(v8::internal::Handle&lt;v8::internal::Map&gt;, int, v8::internal::Handle&lt;v8::internal::Oddball&gt;, 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数量,降低内存压力

三、排查依赖包问题

  • 生成构建统计文件:
    ng build --prod --stats-json
    
    用本地webpack分析工具打开stats.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:45:54