ANT任务maxmemory和通过jvmarg设置堆大小之间的区别?

时间:2017-09-06 21:21:16

标签: jenkins junit ant

我在测试期间遇到堆异常:

[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">

设置这两个值会有多余吗?如果没有,这是推荐的方法吗?

1 个答案:

答案 0 :(得分:1)

这两种方法都达到了相同的最终结果,即;您的测试在分叉的JVM中运行,并且JVM的最大堆大小为1024mb。

我认为在这些方法之间选择时需要考虑的因素是:

  • 构建脚本的读者/维护者是否熟悉JVM最大堆的“原始”指令(即-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>

然而,重点是所有这些方法都在功能上相同,所以这实际上是一个偏好问题,也许,与您自己的项目惯例一致。