症状
本篇指南处理“Gradle Daemon OutOfMemoryError — 构建 JVM 堆”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。
可观察到的症状包括:
- Gradle 构建失败并提示 “Expiring Daemon because JVM heap space is exhausted”
- 每次构建更慢,直至崩溃
- 编译或测试期间出现 java.lang.OutOfMemoryError: Java heap space
诊断
先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。
步骤 1
gradle --status
多个混合版本的闲置守护进程表示存在值得停止的陈旧进程。
步骤 2
gradle -Dorg.gradle.jvmargs="-Xmx2g" build --no-daemon
若更大堆或无守护进程可成功,说明限制来自守护进程内存。
常见诱因(按出现频率排序):
- Gradle 守护进程堆设置低于构建所需
- 多个陈旧守护进程占用内存且不重启
- 测试任务在构建 JVM 内运行,而非独立派生
根因
Gradle 在长期存活的守护进程 JVM 内执行构建。当其堆无法容纳构建模型、缓存脚本与编译时,JVM 抛 OutOfMemoryError,守护进程失效并使构建失败。
修复
提高 org.gradle.jvmargs 的 -Xmx,用 gradle –stop 停止陈旧守护进程,为测试设置 maxHeapSize 派生,并启用配置缓存以减少驻留状态。
注意:过大堆会增加 GC 停顿并降低缓存效率;应按实际需要设置并测量。
# gradle.properties
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -XX:+UseParallelGC
org.gradle.caching=true
org.gradle.configuration-cache=true
# build.gradle.kts: give tests their own heap
tasks.withType<Test> {
maxHeapSize = "2g"
}
验证
调整后重跑构建并确认无 OutOfMemoryError;检查 gradle –status 只显示一个健康守护进程。
修复后补充一条回归测试,复现原始症状,防止问题再次出现。
这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。