如何修复:java.lang.OutOfMemoryError:为项目运行Junit时,请求的数组大小超出了VM限制

问题描述

在运行Junit时遇到异常,不确定导致该问题的代码部分: (使用ANT-1.9.4,ANT_OPTS = -Xmx10G) ()

Tests run: 544,Failures: 1,Errors: 0,Time elapsed: 10,258.816 sec

   [junit] Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
   [junit]  at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
   [junit]  at java.lang.StringCoding.encode(StringCoding.java:344)
   [junit]  at java.lang.StringCoding.encode(StringCoding.java:387)
   [junit]  at java.lang.String.getBytes(String.java:958)
   [junit]  at org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter.endTestSuite(PlainJUnitResultFormatter.java:152)
   [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.fireEndTestSuite(JUnitTestRunner.java:619)
   [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:452)
   [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:911)
   [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:768)

运行测试并开始生成测试报告后,将引发异常。

这是配置junit的方式:

<junit fork="yes" newenvironment="false" haltonfailure="no" failureproperty="junit.failure" printsummary="yes" maxmemory="10096m">

解决方法

确定要使用ANT 1.9.4吗?

您的堆栈跟踪与ANT版本1.8.4中的PlainJUnitResultFormatter的源代码匹配:

out.write(sb.toString().getBytes());

而在ANT版本1.9.4中PlainJUnitResultFormatter的源代码中:

write(StringUtils.LINE_SEP);

发生异常的地方没有String.getBytes()的呼叫。

问原因是来自ANT 1.9.4 release notes的评论:

  • 更改为JUnitTestRunner和PlainJUnitResultFormatter以进行 OutOfMemoryErrors的可能性较小。 Bugzilla报告45536

因此解决方案是升级到ANT 1.9.4或更高版本