升级到 Gradle 5 和 Android 插件 3.3 后,我的构建失败并显示 "Metaspace"
After upgrading to Gradle 5 and Android Plugin 3.3, my build fails with "Metaspace"
这发生在我从 4.10.3 升级到 Gradle 5.0,以及 Android Gradle 插件从 3.2.1 升级到 3.3.0-rc03(后者是因为它是第一个正式支持的 AGP 版本 Gradle 5).
此后当我尝试同步我的项目时,出现错误。错误只说:
* What went wrong:
Metaspace
随后的构建也发出了这个错误,或者更模糊的东西,比如:
* What went wrong:
Could not initialize class com.gradle.scan.a.e.c
这个问题没有明显的解决办法。搜索 "gradle metaspace" 出现 release notes for Gradle 5,它们本身仅在此处引用它:
#7385 - Limit Metaspace used by Gradle
问题本身并不是最有帮助的。
As we know, Java 8 删除了 PermGen 并用 Metaspace 代替。在 Gradle 5 之前,没有为 Metaspace 设置最大值,这意味着它可以无限制地增长(它只会在存在内存泄漏的情况下发生,无论是来自插件还是 Gradle 本身)。使用 Gradle 5,现在默认设置最大限制为 256 MB。一旦 Gradle 进程达到此限制,构建将失败并显示 Metaspace
作为错误。设置此限制是因为它被视为既 "large enough" 又理智,并且还具有更快发现内存泄漏的明确想法。 (来源:我为 Gradle 工作。)
This post给出了线索,但没有直接回答问题。
事实证明,增加元空间限制很简单。将此添加到您的 gradle.properties
:
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
或其他一些对您有意义的值。 512 只是默认值的两倍。显然这不是 "fix" 问题,因为问题是某处内存泄漏。但它会有所帮助。
这发生在我从 4.10.3 升级到 Gradle 5.0,以及 Android Gradle 插件从 3.2.1 升级到 3.3.0-rc03(后者是因为它是第一个正式支持的 AGP 版本 Gradle 5).
此后当我尝试同步我的项目时,出现错误。错误只说:
* What went wrong:
Metaspace
随后的构建也发出了这个错误,或者更模糊的东西,比如:
* What went wrong:
Could not initialize class com.gradle.scan.a.e.c
这个问题没有明显的解决办法。搜索 "gradle metaspace" 出现 release notes for Gradle 5,它们本身仅在此处引用它:
#7385 - Limit Metaspace used by Gradle
问题本身并不是最有帮助的。
As we know, Java 8 删除了 PermGen 并用 Metaspace 代替。在 Gradle 5 之前,没有为 Metaspace 设置最大值,这意味着它可以无限制地增长(它只会在存在内存泄漏的情况下发生,无论是来自插件还是 Gradle 本身)。使用 Gradle 5,现在默认设置最大限制为 256 MB。一旦 Gradle 进程达到此限制,构建将失败并显示 Metaspace
作为错误。设置此限制是因为它被视为既 "large enough" 又理智,并且还具有更快发现内存泄漏的明确想法。 (来源:我为 Gradle 工作。)
This post给出了线索,但没有直接回答问题。
事实证明,增加元空间限制很简单。将此添加到您的 gradle.properties
:
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
或其他一些对您有意义的值。 512 只是默认值的两倍。显然这不是 "fix" 问题,因为问题是某处内存泄漏。但它会有所帮助。