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

Difference between ANT task maxmemory and setting heap size via jvmarg?

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

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

设置这两个值是否多余?如果不是,推荐的方法是什么?

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

我认为在这些方法之间进行选择时要牢记的注意事项是:

  • 您的构建脚本的 reader/maintainer 是否熟悉 JVM 最大堆(即 -Xmx)的 'raw' 指令?
  • 您的 <junit> 任务需要多个自定义 JVM 参数吗?

如果这两个问题的答案都是 "yes" 那么您 (a) 需要 JVM args 超出通过快捷方式支持的参数(例如 maxmemory)和 (b) 您可以希望任何人 reading/maintaining 你的构建脚本都会很舒服地看到构建脚本中表达的 'raw' JVM args。这表明 <jvmarg> 可用于所有 JVM 参数。

如果这些问题的答案是 "no" 那么您根本不需要使用 <jvmarg>,您可以坚持使用它的友好快捷方式:maxmemory.

换句话说,以下两个声明在功能上是相同的,第一个可能更简单:

<junit fork="true" haltonfailure="no" maxmemory="1024m">
    ...
</junit>


<junit fork="true" haltonfailure="no">
    <jvmarg value="-Xmx1024m">
    ...
</junit>

相比之下,接下来的两个声明在功能上也是相同的,但第二个声明可能更一致,因为 all 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>

但是,要点是所有这些方法在功能上是相同的,因此这实际上是一个偏好问题,也许与您自己项目的约定保持一致。