我在测试期间遇到堆异常:
[junit] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我已经阅读了关于此问题的multiple解决方案,但我对哪个是实际正确的方法感到困惑。在ANT任务中,有一个选项,例如:
<junit fork="true" haltonfailure="no" maxmemory="1024m">
其他人建议通过ANT_OPTS或通过任务传递参数,例如:
<jvmarg value="-Xmx1024M">
设置这两个值会有多余吗?如果没有,这是推荐的方法吗?
答案 0 :(得分:1)
这两种方法都达到了相同的最终结果,即;您的测试在分叉的JVM中运行,并且JVM的最大堆大小为1024mb。
我认为在这些方法之间选择时需要考虑的因素是:
-Xmx
)?<junit>
任务是否需要多个自定义JVM参数?如果这两个问题的答案都是“是”,那么您(a)需要超出通过快捷方式支持的JVM(例如maxmemory
)和(b)您可以期待任何人阅读/维护构建脚本将很容易看到构建脚本中表达的“原始”JVM args。这表明<jvmarg>
可以用于所有JVM参数。
如果这些答案为“否”,那么您根本不需要使用<jvmarg>
,并且可以坚持使用其友好的快捷方式:maxmemory
。
换句话说,以下两个声明在功能上是相同的,第一个声明可能更简单:
<junit fork="true" haltonfailure="no" maxmemory="1024m">
...
</junit>
<junit fork="true" haltonfailure="no">
<jvmarg value="-Xmx1024m">
...
</junit>
相比之下,接下来的两个声明在功能上也是相同的,但第二个声明可能更加一致,因为所有 JVM args以相同的方式表达:
<junit fork="true" haltonfailure="no" maxmemory="1024m">
<jvmarg value="-Denv=dev">
...
</junit>
<junit fork="true" haltonfailure="no">
<jvmarg value="-Denv=dev">
<jvmarg value="-Xmx1024m">
...
</junit>
然而,重点是所有这些方法都在功能上相同,所以这实际上是一个偏好问题,也许,与您自己的项目惯例一致。