8

这发生在我从 4.10.3 升级到 Gradle 5.0 以及 Android Gradle Plugin 从 3.2.1 升级到 3.3.0-rc03(后者是因为它是第一个正式支持 Gradle 5 的 AGP 版本)时。

当我尝试在此之后同步我的项目时,我收到一个错误。错误只说:

* What went wrong:
Metaspace

随后的构建也发出了这个错误,或者更模糊的东西,比如:

* What went wrong:
Could not initialize class com.gradle.scan.a.e.c

这个问题没有明显的解决方案。搜索“gradle metaspace”会找到 Gradle 5 的发行说明,这些说明本身仅在此处引用:

#7385 - 限制 Gradle 使用的元空间

问题本身并不是最有帮助的。

4

1 回答 1

21

众所周知,Java 8 移除了 PermGen 并用 Metaspace 取而代之。在 Gradle 5 之前,没有为 Metaspace 设置最大值,这意味着它可以无限制地增长(只有在存在内存泄漏时才会这样做,无论是来自插件还是 Gradle 本身)。在 Gradle 5 中,现在默认设置的最大限制为 256 MB。一旦 Gradle 进程达到此限制,构建将失败并Metaspace显示为错误。设置此限制是因为它被视为“足够大”和理智,并且还具有更快发现内存泄漏的明确想法。(来源:我为 Gradle 工作。)

这篇文章提供了一个线索,但没有直接回答这个问题。

事实证明,增加元空间限制很简单。将此添加到您的gradle.properties

org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m

或其他对您有意义的值。512 只是默认值的两倍。显然,这并不能“解决”问题,因为问题是某处的内存泄漏。但这会有所帮助。

于 2019-01-04T19:46:24.650 回答