gpt4 book ai didi

java - 当测试将大量日志消息打印到 System.out 时,Jenkins 会出现堆内存不足 (OutOfMemoryError)

转载 作者:行者123 更新时间:2023-11-30 06:32:43 25 4
gpt4 key购买 nike

我正在使用 Jenkins 运行一些系统测试。这些测试将 18-20 MB 的打印输出写入标准输出。Jenkins 作业配置为以 2048 MB 的最大堆大小运行。奇怪的是,当这些打印输出打开时,jenkins 会出现 OutOfMemoryError(堆空间不足)。

这肯定是导致问题的打印输出。没有它们,一切正常。困扰我的是,20 MB 的文本如何导致整个过程 OutOfMemory。

我已经将堆大小从 1 GB 增加到 2 GB,但没有任何结果。如果没有打印,在 1GB 最大堆大小上所有测试都可以正常工作。

这里是异常(exception):

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:44)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at java.io.PrintStream.write(PrintStream.java:430)
at org.apache.maven.surefire.util.TeeStream.write(TeeStream.java:42)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:263)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.PrintStream.write(PrintStream.java:476)
at java.io.PrintStream.print(PrintStream.java:619)
at java.io.PrintStream.println(PrintStream.java:756)
...

有谁知道 Jenkins 的某种配置,大量打印到 System.out(其中 20 MB)不会导致 OutOfMemory 发生?

澄清:我不想调试 Jenkins,我不是 Jenkins 开发人员。我使用 Jenkins 在我的应用程序上使用 JUnit 作为 CI 运行系统测试。

最佳答案

尝试使用“-XX:+HeapDumpOnOutOfMemoryError”JVM 参数启动 jenkins,这应该会为您提供一个转储文件,以便在您遇到内存不足异常时进行分析。

编辑——

我想我可能有一些东西给你。
首先,surefire 插件默认派生一个新的 JVM 来运行测试,这个 JVM 不继承 maven JVM 的 JVM 属性,即如果你设置 maven 进程有 2048MB 最大堆,它不会被设置为由 surefire 插件派生的 JVM。
因此,要设置 fork JVM 的 JVM args,请使用 surefire 插件的“argLine”属性。这样您就可以为 fork 的 JVM 而不是 Maven JVM 设置最大堆。

其次,看起来 surefire 插件重定向了 stdout/stderr,并将写入这 2 个流的内容保存在内存中,这就是您可能内存不足的原因。 因此,您也可以尝试将“redirectTestOutputToFile”属性设置为“true”,这样所有 sdtout 都会转到一个文件,这可能会避免将流内容存储在内存中,
或者尝试设置 forkmode='always',这样一来,它会为每个测试类派生一个 JVM,从而防止内存消耗堆积,一个接一个测试。

希望其中之一能帮助您解决问题。

关于java - 当测试将大量日志消息打印到 System.out 时,Jenkins 会出现堆内存不足 (OutOfMemoryError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8630091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com