2017-09-06 35 views
1

我在测试过程中获得堆例外:ANT任务maxmemory和通过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"> 

难道是多余的设置这两个值的建议传递参数的选项,例如为:?如果不是,哪个是推荐的方法?

回答

1

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

我认为考虑牢记这些方法之间的艇员选拔的时候有:

  • 将构建脚本的读/维护者熟悉JVM最大堆“原始”的指令(即-Xmx) ?
  • 您的<junit>任务是否需要多个自定义JVM参数?

如果回答这两个问题是“是”,那么你有(一)需要超出通过快捷方式(如maxmemory)支持的JVM指定参数和(b)您可以预期,任何人都读/保持你的构建脚本可以很容易地看到构建脚本中表达的'原始'JVM参数。这表明<jvmarg>可以用于所有JVM参数。

如果答案是“否”,那么根本不需要使用<jvmarg>,您可以坚持其友好的快捷方式:maxmemory

换一种方式,以下两个声明的功能相同,第一个是,也许简单:

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


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

相比之下,这接下来的两个声明也功能相同,但第二个是也许,在这个意义上所有 JVM ARG游戏以同样的方式表达更加一致:

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

然而,主要的一点是,所有这些方法都功能相同所以它确实是一个偏好问题,也许与您自己项目的约定一致。