为什么堆空间仅在运行JUnit测试时耗尽?

时间:2009-03-25 11:15:34

标签: java eclipse junit out-of-memory

运行JUnit测试时,我似乎总是遇到这个错误:

  

eclipse outOfMemoryError:堆空间

我用JConsole监视Eclipse,堆内存峰值大约为150MB。我已将堆内存设置为1GB。

启动Eclipse时我使用以下参数:

-vm "C:\Program Files\Java\jre1.5.0_08\bin\javaw.exe" -vmargs -Xmx1024M
-XX:MaxPermSize=128M -Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

有谁知道可能导致此问题的原因?它只在运行JUnit测试时才会发生。

5 个答案:

答案 0 :(得分:39)

Junit测试在Eclipse IDE中以不同的vm运行。因此,vm是内存不足而不是Eclipse内存 您可以在测试的运行配置中更改测试vm的设置 您转到运行配置,然后在参数下,您可以设置vm参数。

答案 1 :(得分:16)

继@Thijs Wouters回复,为了解决eclipse中的这个问题,我做了以下几点:

  • 在JUnit下添加了新的运行配置(运行>运行配置> JUnit>新)
  • 在参数选项卡中,如果需要,将VM参数设置为“-Xms64m -Xmx256m”或更高版本

答案 2 :(得分:11)

您的JUnit测试中可能存在内存泄漏。一个常见的问题是:Junit将为中的每个测试方法创建一个TestCase类的新实例并且所有实例变量将保持不变,直到JUnit终止。这意味着:如果你有一个包含50个测试方法的TestCase类和一个在setUp()方法中用1MB对象图初始化的实例变量,那么该TestCase类将需要50MB的堆空间。

编辑:上述问题仅存在于旧版本的JUnit中,我认为它已在JUnit 4中修复。

答案 3 :(得分:2)

我刚刚发布了一个Eclipse插件,它会自动为你设置JUnit启动器的堆大小。你可以从http://code.google.com/p/junitlaunchfixer/得到它。它适用于Eclipse Europa,Ganymede和Galileo。

答案 4 :(得分:1)

我找到了我的问题的解决方案 - 它可以帮助其他人;)当我增加堆大小时,我增加了eclipse应用程序的堆大小,而不是我的程序(我通过eclipse执行)我不得不做什么在运行程序之前修改执行命令。