GradleWorkerMain OutOfMemoryError

sen*_*eft 8 gradle

我正在尝试对基于蚂蚁的(Netbeans RCP)项目进行评分并找到奇怪的gradle行为.我用剖析器做了一些观察并得到了下一个结果.

环境配置

Gradle 1.9
Build time:   2013-11-19 08:20:02 UTC
Build number: none
Revision:     7970ec3503b4f5767ee1c1c69f8b4186c4763e3d

Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy:          2.2.0
JVM:          1.7.0_45 (Oracle Corporation 24.45-b08)
OS:           Linux 2.6.32-431.el6.x86_64 amd64

$ echo $GRADLE_OPTS
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Xms256m -Xmx2048m
$ echo $ANT_OPTS
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Xms256m -Xmx2048m
Run Code Online (Sandbox Code Playgroud)

使用gradle运行导入的ant junit测试任务

Gradle fork为此分离jvm并运行具有不同Xmx值的JUnitTestRunner,忽略$ GRADLE_OPTS和$ ANT_OPTS值: - 108.80 MB

不知道gradle如何为每个JUnitTestRunner ant任务定义Xmx大小.它在每个任务期间作为GC工作正常.所有模块的所有单元测试都没有错误地通过.

为相同的模块运行gradle构建任务

Gradle知道以前的构建结果,并立即开始对未经测试的模块进行junit测试.您可以在这里看到输出!Gradle fork为此分离jvm(忽略$ GRADLE_OPTS值)并运行GradleWorkerMain.而这个jvm有1.42GB Xmx和500 MB(见快照)立即占用!然后使用的内存大小达到1.5GB.然后GC因未知原因无法释放内存并抛出

- java.lang.OutOfMemoryError:超出了GC开销限制

- 控制台日志

- 快照

更多细节:

- gradle主要jvm细节

- GradleWorkerMain jvm详细信息

问题

  • 为什么ant任务max Xmx大小在540 MB足以进行测试而GradleWorkerMain 1.5GB还不够?

  • 我是gradle的新手,所以我的build.gradle可能包含导致这种GradleWorkerMain奇怪行为的错误.这是真的吗?什么可能的解决方案?

  • 如何为GradleWorkerMain jvm提供更多Xmx?

Pet*_*ser 14

要控制Gradle测试JVM可用的内存量,请配置相应的Test任务.例如:

test {
    maxHeapSize = "1024m"
    jvmArgs "-XX:MaxPermSize=256m"
}
Run Code Online (Sandbox Code Playgroud)

  • 更具体地说: -XX:MaxPermSize 变成 -XX:MaxMetaspaceSize (4认同)
  • 对于使用 Java 8 的用户,移除了 `XX:MaxPermSize`。 (2认同)