Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有大标准输出的Gradle堆空间问题_Java_Maven_Gradle - Fatal编程技术网

Java 具有大标准输出的Gradle堆空间问题

Java 具有大标准输出的Gradle堆空间问题,java,maven,gradle,Java,Maven,Gradle,当我用gradle构建我的项目时,测试输出是巨大的,我想保留它们。因此,我激活显示输出流: test { testLogging.showStandardStreams = true } 不幸的是,gradle似乎无法处理大型标准输出。为了演示,我创建了一个最小的示例:这是一个在测试中创建大型标准输出的项目 @Test public void test() { long start = System.currentTimeMillis(); for (int i = 0;

当我用gradle构建我的项目时,测试输出是巨大的,我想保留它们。因此,我激活显示输出流:

test {
    testLogging.showStandardStreams = true
}
不幸的是,gradle似乎无法处理大型标准输出。为了演示,我创建了一个最小的示例:这是一个在测试中创建大型标准输出的项目

@Test
public void test() {
   long start = System.currentTimeMillis();
   for (int i = 0; i < 200; i++) {
      for (int j = 0; j < 10000; j++) {
         long current = System.currentTimeMillis() - start;
          System.out.println("This is a simple logging output: " + i + " " + j + " " + current);
      }
   }
}
如果我在
时间之前在gradle中运行它。/gradlew test&>gradle.txt
,它根本不会完成(在合理的时间内),并且输出包含许多
即将过期的守护进程,因为JVM堆空间已耗尽。暂时解决这个问题的一种方法是增加堆内存(如这里所建议的:),但根据我的实验,
-Xmx4g
不会改变任何东西,而且这显然不会扩展到更大的输出。此外,运行
/gradlew-i测试
不会改变行为

该项目还包含maven()和gradle(-10分钟后中止进程)以及gradle创建的一个堆转储()的输出示例文件。gradle日志中的当前时间仅略有增加(每行的第三个输出编号)。因此,我假设gradle主要有打印到标准输出和不执行程序的问题

这表明,尽管gradle在打印到标准输出时存在一些问题,但它似乎并没有阻止测试的执行。我能给gradle任何开关或参数,迫使gradle直接打印到标准输出,而不是进行内存密集型处理吗?不幸的是,我在文档()中没有找到任何内容

编辑刚刚完成服务器上的测试运行:

reichelt@r147:~/workspaces/dissworkspace/stdout-test$ time ./gradlew test &> gradle.txt

real    28m17,959s
user    216m37,351s
sys     0m12,410s
以一个例外结束:

    This is a simple logging output: 89 7842 1416
    This is a simple logging output: 89 7843 1416
    This is a simple logging output: 89 7844 1416
    This is a simple logging output: 89 7845 1416
    This is a simple logging output: 89 7846 1416
FAILURE: Build failed with an exception.

* What went wrong:
GC overhead limit exceeded

我真的没有一个解决方案给你,但我想分享一些意见,这些意见太长了,不能放在评论中

首先,我可以从Github存储库中重现OutOfMemory问题。我在谷歌上搜索了一下,虽然还有其他关于OOM的报道,但没有一个有解决方案。我认为这只是Gradle在启用
showStandardStreams
时的一个限制。我试图摆弄控制台输出类型和一些其他参数,但都没有效果

但是,禁用showStandardStreams后,我将无法获得OOM。即使将您指定的迭代次数从200*10000猛增到1000*10000,也不会。它工作正常,输出被保存到一个.bin、.xml和一个.html文件中供以后检查

此外,Gradle在我的机器上运行的速度是Maven的两倍多:

λ time ./gradlew test &> gradle.txt

real    1m23.113s
user    0m0.015s
sys     0m0.031s

λ time mvn test &> mvn.txt

real    3m6.671s
user    0m0.183s
sys     0m0.566s
不知道为什么两者之间有如此大的差异


虽然我完全同意将
showStandardStreams
用于大型输出会很好,就像Maven默认的那样,但除非您能够相应地提高最大堆大小,否则这似乎是不可能的。另一方面,将输出保存在报告中也很不错,这是Maven中的Surefire插件所没有的。

标准流应该已经保存为测试报告的一部分。情况并非如此,或者即使未设置
showStandardStreams
,它是否也会耗尽堆空间?如果未设置
showStandardStreams
,则在执行更多次后会出现问题。对我来说,它是在我将第一个循环设置为
For(inti=0;I<500;I++){
之后出现的(并且maven在大约40秒后仍然退出)。在我的实际使用案例中,不幸的是,问题仍然存在,因为它的stdout具有相似的数量级。不管GC问题如何,如果我可以使用
showStandardStreams
直接重定向stdout以处理大日志,那就太好了(而不是执行我的流程并分析
构建/测试结果/test/binary/output.bin
)。
λ time ./gradlew test &> gradle.txt

real    1m23.113s
user    0m0.015s
sys     0m0.031s

λ time mvn test &> mvn.txt

real    3m6.671s
user    0m0.183s
sys     0m0.566s