第2章 Gradle 守护进程参数调优

2.1 参数原理

Gradle 守护进程(Daemon)是一个长期运行的后台 JVM 进程,用于缓存项目配置、已加载的插件和类加载器,从而避免每次构建都重新初始化。开启守护进程可显著缩短构建启动时间,特别是对多模块项目。

并行构建(org.gradle.parallel)允许 Gradle 同时执行多个不依赖的 task,最大化 CPU 利用率。默认情况下 Gradle 串行执行,开启并行后需注意内存和锁竞争。

JVM 参数配置(如堆大小 -Xmx、垃圾回收器 -XX:+UseG1GC)直接影响守护进程的稳定性和构建吞吐量。参数设置过低会导致频繁 GC 或 OOM,过高则浪费系统资源。

2.2 实现流程

  1. 在项目根目录或 ~/.gradle/ 下创建或编辑 gradle.properties 文件。
  2. 设置守护进程开关、并行构建标志。
  3. 调整 JVM 参数:堆大小、GC 策略、元空间大小等。
  4. 重启构建任务使配置生效。
  5. 通过 gradle --status 验证守护进程状态。

2.3 代码/配置示例

以下配置放置在 gradle.properties 中:

# 开启守护进程(默认 true)
org.gradle.daemon=true

# 开启并行构建
org.gradle.parallel=true

# 配置 JVM 参数:堆最大 2G,使用 G1 垃圾回收器,元空间 256M
org.gradle.jvmargs=-Xmx2g -XX:+UseG1GC -XX:MaxMetaspaceSize=256m -Dfile.encoding=UTF-8

若项目需要更多并行 worker,可指定最大并行数(默认等于 CPU 核心数):

# 限制并行任务数为 4
org.gradle.workers.max=4

2.4 调试方法

  • 查看守护进程列表:gradle --status,输出显示 PID、版本、JVM 参数。
  • 检查守护进程实际内存:jps -lv | grep GradleDaemon 查看 JVM 参数。
  • 强制停止所有守护进程:gradle --stop,然后重新构建观察日志。
  • 开启 Gradle 详细日志:gradle build --info,搜索 "Starting daemon" 或 "Using daemon"。
  • 分析 GC 日志:在 JVM 参数中添加 -Xlog:gc*:file=gc.log。

2.5 性能优化结果

以下对比基于同一多模块 Android 项目(50 个模块,clean build)的实验数据:

配置首次构建(含冷启动)二次构建(热启动)内存峰值
无守护进程,无并行4 分 30 秒4 分 25 秒1.8 GB
守护进程开启,无并行4 分 10 秒2 分 05 秒2.1 GB
守护进程 + 并行 4 worker3 分 50 秒1 分 20 秒3.2 GB
守护进程 + 并行 + 优化 JVM(G1、2G heap)3 分 40 秒1 分 10 秒2.6 GB(GC 更稳定)

可见,开启守护进程和并行构建后热构建时间可缩短 50% 以上,合理 JVM 参数能缓解内存飙升。

提示: 当守护进程内存不足导致 OOM 时,Gradle 会自动重启一个新的守护进程,但会丢失缓存效果。建议根据项目模块数量调整 -Xmx:每 10 个模块增加 512 MB。

2.6 常见错误与修复

错误现象原因修复方法
java.lang.OutOfMemoryError: Java heap space守护进程堆太小增大 org.gradle.jvmargs=-Xmx 值,建议 2G 起步。
Gradle Daemon disappeared守护进程被系统 OOM Killer 杀掉降低并行 worker 数,或增大系统交换空间。
Could not open proj class cache多个守护进程版本冲突执行 gradle --stop 清空所有进程,再重试。
构建日志中出现大量 Full GCGC 策略不当或堆过小切换为 G1GC(-XX:+UseG1GC),调整 -XX:MaxGCPauseMillis=200。
并行构建时 task 执行顺序错乱依赖未正确声明检查 dependsOn 或 mustRunAfter,或使用 --no-parallel 临时验证。
警告: 不要将 org.gradle.jvmargs 设置为超过物理内存 70% 的值,否则容易触发系统 OOM 或 swap 抖动,反而降低构建速度。

2.7 守护进程与并行构建交互流程

下图展示守护进程如何管理并行 worker 与 JVM 内存分配:

Gradle 守护进程并行构建与 JVM 参数交互 Gradle Daemon JVM 参数 (-Xmx, GC) 并行 Worker 池 任务队列 (Task) 构建输出 说明:守护进程启动时根据 org.gradle.jvmargs 分配堆和 GC, 并行 Worker 从任务队列拉取不依赖的 task 并发执行, 构建结束后守护进程保持运行,等待下一次构建请求。