第2章 Gradle 守护进程参数调优
2.1 参数原理
Gradle 守护进程(Daemon)是一个长期运行的后台 JVM 进程,用于缓存项目配置、已加载的插件和类加载器,从而避免每次构建都重新初始化。开启守护进程可显著缩短构建启动时间,特别是对多模块项目。
并行构建(org.gradle.parallel)允许 Gradle 同时执行多个不依赖的 task,最大化 CPU 利用率。默认情况下 Gradle 串行执行,开启并行后需注意内存和锁竞争。
JVM 参数配置(如堆大小 -Xmx、垃圾回收器 -XX:+UseG1GC)直接影响守护进程的稳定性和构建吞吐量。参数设置过低会导致频繁 GC 或 OOM,过高则浪费系统资源。
2.2 实现流程
- 在项目根目录或
~/.gradle/下创建或编辑gradle.properties文件。 - 设置守护进程开关、并行构建标志。
- 调整 JVM 参数:堆大小、GC 策略、元空间大小等。
- 重启构建任务使配置生效。
- 通过
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 worker | 3 分 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 GC | GC 策略不当或堆过小 | 切换为 G1GC(-XX:+UseG1GC),调整 -XX:MaxGCPauseMillis=200。 |
| 并行构建时 task 执行顺序错乱 | 依赖未正确声明 | 检查 dependsOn 或 mustRunAfter,或使用 --no-parallel 临时验证。 |
警告: 不要将
org.gradle.jvmargs 设置为超过物理内存 70% 的值,否则容易触发系统 OOM 或 swap 抖动,反而降低构建速度。
2.7 守护进程与并行构建交互流程
下图展示守护进程如何管理并行 worker 与 JVM 内存分配: