为什么只有在运行 JUnit 测试时堆空间才会耗尽?
运行 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 测试时才会发生。
When running JUnit tests, I always seem to run into this error:
eclipse outOfMemoryError: heap space
I have monitored Eclipse with JConsole and heap memory peaks at about 150MB. I have set heap memory to 1GB.
I am using the following arguments when starting 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
Does anyone know what may be causing this issue? It happens only when running JUnit tests.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Junit 测试在与 Eclipse IDE 不同的虚拟机中运行。 所以内存不足的是虚拟机而不是 Eclipse 内存不足。
您可以在测试的运行配置中更改测试虚拟机的设置。
您转到运行配置,然后在参数下,您可以设置虚拟机参数。
Junit tests are run in a different vm as the Eclipse IDE. So it is that vm that is out of memory and not the Eclipse one.
You can change the settings of the test vm in the run configurations of the test.
You go to the run configurations and then under arguments, you can set the vm arguments.
根据 @Thijs Wouters 响应,为了在 Eclipse 中解决此问题,我执行了以下操作:
Further to @Thijs Wouters response, to fix this issue in eclipse I did the following:
您的 JUnit 测试中可能存在内存泄漏。 一个常见的问题是:Junit 将为其中的每个测试方法创建一个 TestCase 类的新实例,并且所有实例变量都将保留,直到 JUnit 终止。 这意味着:如果您有一个包含 50 个测试方法的 TestCase 类和一个在 setUp() 方法中使用 1MB 对象图初始化的实例变量,则该 TestCase 类将需要 50MB 堆空间。
编辑:上述问题仅存在于旧版本的 JUnit 中,我认为它已在 JUnit 4 中修复。
You probably have a memory leak in your JUnit tests. A common gotcha is this: Junit will create a new instance of a TestCase class for every test method in it And all instance variables will be kept around until JUnit terminates. That means: if you have a TestCase class with 50 test methods and an instance variable that is initialized with a 1MB object graph in your setUp() method, then that TestCase class will require 50MB heap space.
Edit: the problem described above only exists in older versions of JUnit, I think it was fixed in JUnit 4.
我刚刚发布了一个 Eclipse 插件,它将自动为您设置 JUnit 启动器上的堆大小。 您可以从 http://code.google.com/p/junitlaunchfixer/ 获取它它可与 Eclipse Europa、Ganymede 和 Galileo 配合使用。
I've just released a plugin for Eclipse that will automatically set the heap size on JUnit launchers for you. You can get it from http://code.google.com/p/junitlaunchfixer/ It works with Eclipse Europa, Ganymede and Galileo.
我找到了我的问题的解决方案 - 它可能会帮助其他人;)当我增加堆大小时,我增加了 Eclipse 应用程序的堆大小,而不是我的程序(我通过 Eclipse 执行的)的堆大小,我必须做的是修改在运行我的程序之前执行命令。
I found the solution to my problem - it may help others ;) When I was increasing the heap size I was increasing the heap size of eclipse application, not of my program (which I executed through eclipse) What I had to do is modify the execution commands before running my program.