在部署 AWS Amplify 构建时,我收到 "Out of memory" 错误。
简短描述
当您在 Amplify 控制台中部署构建时,Amplify 会创建一个配备 4 个虚拟 CPU (vCPU) 和 8GB RAM 的临时计算容器。如果构建所需内存超过默认的 8GB,则您可能会收到以下内存不足错误之一:
"JavaScript heap out of memory"
"FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed"
"SIGKILL directive"
内存消耗因包管理器、构建工具、框架以及整体项目复杂性而异。
解决方法
确定您的内存需求
要检查应用程序的内存使用量并测量构建的内存消耗,请完成以下步骤:
- 在项目目录中打开 Windows 终端或 PowerShell。
- 要确定峰值内存使用量,请根据您的操作系统 (OS) 运行以下命令。
Linux 或 macOS:
/usr/bin/time -l npm run build
Windows:
path = (Get-Location).Path; job = Start-Job -ScriptBlock { Set-Location -Path Using:path; npm run build }; maxMemory = 0; while (job.State -eq 'Running') { currentMemory = (Get-Process -Name 'node' -ErrorAction SilentlyContinue | Measure-Object -Property WorkingSet64 -Sum).Sum; if (currentMemory -gt maxMemory) { maxMemory = currentMemory }; Start-Sleep -Seconds 1 }; Wait-Job job; Receive-Job job; Write-Host "Peak Memory Usage: ([math]::Round(maxMemory / 1MB, 2)) MB"; Remove-Job job
要使用 Node.js 确定瓶颈并找到内存密集型操作,请完成以下步骤:
-
在项目目录中打开命令提示符。
-
运行以下命令以获取适用于您框架的分析命令:
React (CRA): node --prof node_modules/react-scripts/scripts/build.js Vite : node --prof node_modules/vite/bin/vite.js build
Next.js : node --prof node_modules/next/dist/bin/next build
Vue CLI : node --prof node_modules/@vue/cli-service/bin/vue-cli-service.js build
-
运行以下命令以生成分析报告:
node --prof-process isolate-0x*.log > profile_report.txt
注意**:**分析报告会显示有关构建过程中函数调用和内存分配的时间相关信息。借助这些信息来确定资源占用最多以及可以优化的操作。
更新您的 Amplify 配置
**注意:**如果您在 GitHub 存储库中使用的是 amplify.yml 文件,则必须直接在存储库中更新该文件,而不是在 Amplify 控制台中进行更新。
配置内存优化环境变量
为了在大型应用程序的构建过程中优化内存使用量,请在构建中添加内存优化环境变量。根据您的应用程序类型,编辑构建规范,并将以下环境变量添加到 YAML 配置文件的 preBuild 部分:
- React 应用程序:
frontend:
phases:
preBuild:
commands:
- npm install
- export NODE_OPTIONS=--max-old-space-size=5632
- export GENERATE_SOURCEMAP=false
- export INLINE_RUNTIME_CHUNK=false
**注意:**NODE_OPTIONS=--max-old-space-size=5632 可将 Node.js 堆内存配额增加到 5.5GB,以防止在大型构建过程中出现内存不足错误。GENERATE_SOURCEMAP=false 可停用源映射生成,并减少内存消耗和构建时间。INLINE_RUNTIME_CHUNK=false 可减少捆绑过程中的内存开销。
- 非 React 应用程序:
frontend:
phases:
preBuild:
commands:
- npm install
- export NODE_OPTIONS=--max-old-space-size=5632
**注意:**INLINE_RUNTIME_CHUNK=false 可减少捆绑过程中的内存开销。GENERATE_SOURCEMAP 和 INLINE_RUNTIME_CHUNK 特定于 React 应用程序。
暂时停用缓存
为了在构建创建过程中减少内存使用量,请完成以下步骤以暂时停用缓存:
-
打开 Amplify 控制台。
-
选择您的应用程序。
-
选择 Hosting(托管)。
-
选择 Build settings(构建设置)。
-
在 App build specification(应用程序构建规范)下,选择 Edit(编辑)。
-
在 cache(缓存)部分添加 # 哈希值。配置示例:
#cache:
#paths:
#- node_modules/**/*
#- .next/cache/**/*
#- .npm/**/*
-
选择 Save(保存)。
**注意:**停用缓存后,内存使用量会减少,但构建时间会增加。
-
构建完成后,从 cache(缓存)部分移除 # 哈希值以重新激活缓存。配置示例:
cache:
paths:
- node_modules/**/*
- .next/cache/**/*
- .npm/**/*
升级构建容器大小
如果您的应用程序需要超过 8GB 的 RAM,请完成以下步骤以增加构建实例的大小:
-
打开 Amplify 控制台。
-
选择您的应用程序。
-
选择 Hosting(托管)。
-
选择 Build settings(构建设置),然后选择 Advanced settings(高级设置)。
-
选择 Edit(编辑)。
-
选择您的构建实例类型。
-
选择 Save(保存)。
-
在 App build specification(应用程序构建规范)下,选择 Edit(编辑)。
-
根据您的实例类型更新 max-old-space-size 参数:
大型实例 (16GiB):
--max-old-space-size=14000
大型实例 (32GiB):
--max-old-space-size=28000
-
选择 Save(保存)。
-
在导航窗格中,选择 Overview(概览)。
-
选择您的应用程序分支。
-
选择最新部署,然后选择 Redeploy this version(重新部署此版本)。
**注意:**为避免构建失败,请为系统进程预留 1GB 内存。有关构建实例定价的信息,请参阅 AWS Amplify 定价。