Gradle Daemon内存设置需按项目规模、JDK版本和可用内存精准配置,不能盲目设高;中型Android项目在JDK 8下推荐-Xmx2048m -XX:MaxMetaspaceSize=512m,纯Java小项目-Xmx1024m即可,且必须同时调优堆与元空间以避免OutOfMemoryError。

Gradle Daemon内存设置不能只看“推荐值”
Gradle Daemon的内存不是越大越好,盲目设成 -Xmx4096m 很可能触发 java.lang.OutOfMemoryError: Metaspace 或导致系统卡死。关键要看项目规模、JDK版本和机器实际可用内存——中型Android项目在JDK 8下用 -Xmx2048m -XX:MaxMetaspaceSize=512m 是安全起点;纯Java后端小项目甚至 -Xmx1024m 就够用。
为什么org.gradle.jvmargs里要同时调堆和元空间
JDK 8+ 默认启用元空间(Metaspace),它不走堆内存,但会动态增长。如果只加堆内存不设 MaxMetaspaceSize,Daemon在加载大量插件(比如Android Gradle Plugin 7.4+、Kotlin编译器)时可能把元空间撑爆,报错 java.lang.OutOfMemoryError: Metaspace。实测发现:AGP 7.2以上项目未限制元空间,构建中途崩溃概率提升3倍以上。
-
-Xmx2048m控制堆内存上限,影响依赖解析、编译缓存等主流程 -
-XX:MaxMetaspaceSize=512m防止类加载器无限膨胀,尤其多模块+Kotlin项目必须显式设 -
-Dfile.encoding=UTF-8必须加,否则中文路径或资源文件读取失败(Windows常见)
怎么验证Daemon当前用了多少内存
别猜,直接看日志。执行 ./gradlew --status 后,找到对应版本的Daemon进程ID,再用 jstat -gc <pid></pid> 查实时GC数据。重点关注 MU(Metaspace使用量)和 EU(Eden区使用量)——如果 MU 接近你设的 MaxMetaspaceSize,就该调高了;如果 EU 长期>90%且GC频繁,说明堆不够。
- Daemon空闲时通常占200–300MB,构建峰值可能冲到1GB+
- CI服务器上建议保守些:
-Xmx1536m -XX:MaxMetaspaceSize=384m,避免挤占其他任务内存 - Mac M1/M2用户注意:ARM版JDK对Metaspace管理更激进,
MaxMetaspaceSize建议比x64低20%
什么时候该关掉Daemon
不是所有场景都适合开Daemon。老款笔记本(≤8GB RAM)、CI单次构建环境、或者用 gradle --no-daemon 调试构建脚本时,强行开启反而拖慢速度。Daemon本质是复用JVM,但如果每次构建都要重建(比如CI里清空$HOME/.gradle/daemon/),那它就是个摆设。
- 本地开发:开,配好内存参数后能省5–10秒冷启动时间
- CI流水线:看情况——Jenkins Pipeline若每个job都独立workspace,Daemon基本无效,不如关掉省内存
- 调试build.gradle逻辑:临时加
--no-daemon --stacktrace,避免Daemon缓存干扰


















