当我从4.10.3升级到Gradle 5.0,以及从3.2.1升级到3.3.0-rc03的Android Gradle插件时,就会发生这种情况(后者是因为它是第一个正式支持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 使用的元空间
而且问题本身并不是最有帮助的。
众所周知,Java 8删除了PermGen,取而代之的是Metaspace。在 Gradle 5 之前,没有为 Metaspace 设置最大值,这意味着它可以不受限制地增长(只有在内存泄漏的情况下才会这样做,无论是来自插件还是 Gradle 本身)。在 Gradle 5 中,现在默认将最大限制设置为 256 MB。一旦 Gradle 进程达到此限制,构建将失败,Metaspace
为错误。设置此限制是因为它被视为"足够大"和理智,并且还具有更快地发现内存泄漏的明确想法。(资料来源:我在Gradle工作。
这篇文章提供了一个线索,但没有直接回答这个问题。
事实证明,增加元空间限制很简单。将此添加到您的gradle.properties
:
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
或者其他一些对你有意义的值。 512 只是默认值的两倍。显然,这并不能"解决"问题,因为问题是某处的内存泄漏。但它会有所帮助。