← 中文资源

简体中文版本

Gradle Daemon OutOfMemoryError — 构建 JVM 堆

通过提高守护进程堆、停止陈旧守护进程,并分离构建 JVM 与测试 JVM 的内存,修复 Gradle daemon 的 OutOfMemoryError。

阅读英文原文

症状

本篇指南处理“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 只显示一个健康守护进程。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。