我正在尝试对基于蚂蚁的(Netbeans RCP)项目进行评分并找到奇怪的gradle行为。 我用profiler做了一些观察并得到了下一个结果。
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
build.gradle - 包含ant任务的导入(清理,构建,单元测试)
Gradle fork为此分离jvm并以不同的Xmx值运行JUnitTestRunner,忽略 $ GRADLE_OPTS和$ ANT_OPTS值: - 108.80 MB
不知道gradle如何为每个JUnitTestRunner ant任务定义Xmx大小。 它工作得很好,在每个任务期间都是GC。 所有模块的所有单元测试都没有错误地通过。
Gradle知道以前的构建结果,并立即开始对未经测试的模块进行junit测试。 您可能会看到输出here! Gradle fork为此分离jvm(忽略$ GRADLE_OPTS值)并运行GradleWorkerMain。 这个jvm有1.42GB Xmx和500 MB(见snapshot) 马上占领了!然后使用的内存大小达到1.5GB。 然后GC因未知原因无法释放内存并抛出
- java.lang.OutOfMemoryError: GC overhead limit exceeded
- snapshot
更多详情:
- GradleWorkerMain jvm details
为什么ant task max max Xmx size 540 MB足以进行测试而GradleWorkerMain 1.5GB还不够?
我是新手,因此我的build.gradle可能包含错误 在这样的GradleWorkerMain奇怪的行为。这是真的吗?可能的解决方案是什么?
如何为GradleWorkerMain jvm提供更多Xmx?
答案 0 :(得分:13)
要控制Gradle测试JVM可用的内存量,请配置相应的Test
任务。例如:
test {
maxHeapSize = "1024m"
jvmArgs "-XX:MaxPermSize=256m"
}