我正在尝试对基于蚂蚁的项目(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任务的导入(清理、构建、单元测试)
- settings.gradle的
使用gradle运行导入的ant junit测试任务
Gradle fork为此分离jvm并使用不同的Xmx值运行JUnitTestRunner,忽略$GRADLE_OPTS和$ANT_OPTS值
不知道gradle是如何为每个JUnitTestRunner ant任务定义Xmx大小的。它工作得很好,就像每个任务期间的GC一样。所有模块的所有单元测试都通过了,没有错误。
运行相同模块的gradle构建任务
Gradle知道以前的构建结果,并立即启动未测试模块的junit测试。您可能会看到输出here!Gradle fork为此分离jvm(忽略$GRADLE_OPTS值)并运行GradleWorkerMain。并且此jvm具有1.42GB Xmx和500 MB立即占用!然后使用的内存大小达到1.5GB。然后GC由于未知原因无法释放内存并抛出
常见问题
- 为什么蚂蚁任务的最大Xmx大小在540 MB足够测试,而GradleWorkerMain 1.5GB是不够的?
- 我是gradle的新手,所以可能是我的build.gradle包含错误,导致GradleWorkerMain出现奇怪的行为。这是真的吗?可能的解决方案是什么?
- 如何为GradleWorkerMain JVM提供更多Xmx?
2条答案
按热度按时间li9yvcax1#
要控制Gradle测试JVM的可用内存量,请配置相应的
Test
任务。例如:字符串
kcwpcxri2#
基本上,Gradle运行所有的测试类Java。Java 11默认堆内存大小为256 MB。这不足以运行所有的测试类Java。这会导致“Java内存不足“错误。我们可以通过添加下面的代码在测试运行中增加堆内存来解决这个问题。如果测试用例更多,我们需要增加堆大小比我给的更多。
我们升级到Java 17就不会遇到这个问题了,因为Java 17会占用1/4的物理内存作为堆内存
dependencies.gradle
字符串