【问题标题】:Why does heap space run out only when running JUnit tests?为什么只有在运行 JUnit 测试时堆空间才会用完?
【发布时间】:2010-10-15 10:23:06
【问题描述】:

在运行 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 测试时才会发生。

【问题讨论】:

  • 能否提供更多详细信息?哪个版本的 Eclipse?哪个版本的 JUnit?任何模拟对象框架?引发异常的代码 sn-p?幕后有什么框架吗?

标签: java eclipse junit out-of-memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那么有什么解决办法呢?要在静态 @BeforeClass 方法中设置 1MB 对象?
    • @dantiston:不,在拆卸方法中将引用设置为 null。但我认为当前版本的 JUnit 工作方式不同,无论如何都没有这个问题。
    • 我不知道情况在 3 和 4 之间是否有所改善,但至少在 4.11 中,我们需要在 @After-methods 中取消测试类实例中的引用,以防止测试运行到 OOME .
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        除了@Thijs Wouters 的回应,为了在 Eclipse 中解决这个问题,我做了以下操作:

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

        【讨论】:

          猜你喜欢
          • 2015-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-29
          • 2014-05-24
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多