Gradle 9.5.0 刚推出不久,9.5.1 就紧随而至——这不是常规迭代,而是针对一个让不少团队头疼的问题打补丁:从 9.4.1 升级到 9.5.0 后出现的 OOM(OutOfMemoryError)。如果你的项目在升级后构建时莫名崩溃,这个版本值得立刻关注。
OOM 问题到底出在哪
从摘要信息看,9.5.0 引入的变更导致部分从 9.4.1 升级的项目在构建过程中触发内存溢出。这类问题通常出现在以下场景:
- 大型多模块项目——模块数量多、依赖图复杂,Gradle 在解析依赖或执行任务时内存消耗陡增。
- 配置阶段内存不足——
build.gradle中大量自定义逻辑或插件在配置期就占满了堆内存。 - Gradle Daemon 进程被杀——Daemon 默认堆上限有限,遇到内存暴涨时直接 OOM 退出,构建中断。
补丁版本 9.5.1 针对这一回归问题做了修复,意味着升级路径从 9.4.1 → 9.5.0 的阻塞点被打通了。
升级前先确认你的现状
在动手升级之前,先搞清楚当前项目的 Gradle 版本和 Daemon 内存配置:
# 查看当前 Gradle 版本
gradle --version
# 查看 Daemon 状态和内存使用
gradle --status
# 如果之前升级到 9.5.0 后出现 OOM,先停掉所有 Daemon
gradle --stop
如果之前 9.5.0 构建时出现过类似 java.lang.OutOfMemoryError: Java heap space 的错误日志,9.5.1 大概率能解决。但即便如此,合理配置 Daemon 内存仍然是必要保障。
实践:升级到 9.5.1 并调优内存
第一步:更新 Gradle Wrapper
大多数项目通过 Wrapper 管理 Gradle 版本,这是最安全的升级方式:
# 升级 Wrapper 到 9.5.1
gradle wrapper --gradle-version 9.5.1
执行后 gradle/wrapper/gradle-wrapper.properties 会自动更新:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
之后所有开发者执行 ./gradlew 就会自动下载 9.5.1。
第二步:给 Daemon 分配足够内存
OOM 问题虽然被修复,但大型项目仍需要合理的内存上限。在 gradle.properties 中配置:
# gradle.properties — 项目根目录或 ~/.gradle/ 下
# Daemon 最大堆内存,大型项目建议 2G 以上
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError
# 开启并行构建,多模块项目效果明显
org.gradle.parallel=true
# 按需配置,跳过不需要的模块
org.gradle.configuration-cache=true
-XX:+HeapDumpOnOutOfMemoryError 这个参数很实用——万一还是 OOM,它会自动生成堆转储文件,方便用 VisualVM 或 MAT 分析到底是哪段代码在吃内存。
第三步:一个最小可运行的多模块示例
下面是一个可以直接跑起来的多模块项目结构,用来验证 9.5.1 是否正常工作:
// settings.gradle
rootProject.name = 'gradle-951-demo'
include 'app', 'lib'
// build.gradle(根项目)
plugins {
id 'java' apply false
}
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
}
// lib/build.gradle
plugins {
id 'java-library'
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.14.0'
}
// app/build.gradle
plugins {
id 'java'
id 'application'
}
application {
mainClass = 'com.demo.Main'
}
dependencies {
implementation project(':lib')
}
// app/src/main/java/com/demo/Main.java
package com.demo;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
System.out.println(StringUtils.capitalize("gradle 9.5.1 works!"));
}
}
验证构建:
# 清理 + 构建 + 运行
./gradlew clean build run
# 预期输出:Gradle 9.5.1 works!
如果构建顺利完成没有 OOM,说明补丁生效。
升级建议与注意事项
- 不要跳过 Wrapper 升级——直接改
distributionUrl也能生效,但gradle wrapper命令会同步更新 Wrapper 脚本本身,避免旧脚本与新版本不兼容。 - 先在 CI 上试跑——本地验证通过后,在 CI 环境跑一次完整构建。CI 机器内存通常比开发机更紧张,更容易暴露问题。
- 保留
--stacktrace习惯——如果构建仍然失败,用./gradlew build --stacktrace获取完整调用栈,确认是否还是 OOM 还是其他问题。 - 清理旧 Daemon 缓存——升级版本后旧 Daemon 可能残留,
gradle --stop之后再构建,确保新版本 Daemon 启动。 - 关注后续补丁——9.5.1 是第一个补丁,如果社区反馈还有其他回归问题,9.5.2 可能很快跟进。锁定 Wrapper 版本可以随时一键升级。
Gradle 的补丁版本通常只修特定问题,不引入新特性,风险低。如果你正卡在 9.4.1 → 9.5.0 的 OOM 上,9.5.1 就是那个解锁键。