代码之家  ›  专栏  ›  技术社区  ›  Simon Tower

朱尼特java.lang.OutOfMemoryError运行包中的所有测试时

  •  6
  • Simon Tower  · 技术社区  · 16 年前

    在包中加载所有单元测试时,make任务抛出一个java.lang.OutOfMemoryError:Java堆空间错误。

    不过,如果我运行每个子包中的所有测试,那么所有测试都会加载并完成。只有当我尝试运行父包中的所有测试时,才会发生OOM错误。

    这使我相信在不同包中的加载测试之间存在一些垃圾收集问题,或者有一些过于急切的类加载正在进行。

    是否有一个JUnit设置可以处理这些问题,还是必须通过在测试用例中更改或添加代码来解决这个问题?

    3 回复  |  直到 16 年前
        1
  •  10
  •   Aaron Digulla    16 年前

    必须将测试类的所有字段设置为 null 在里面 tearDown() .

    原因是JUnit实例化了测试类的一个实例 每次测试 . 它在整个时间内保持该实例,以保存测试结果(成功、失败、堆栈跟踪)。所以如果你使用字段,它们会留下来,你就会耗尽内存。

        2
  •  4
  •   Adamski    16 年前

    我在使用TestNG时遇到了类似的问题,并将其追溯到我生成到控制台的日志信息量。一旦我减少了这个,我就可以运行我的测试套件而没有内存问题。

        3
  •  3
  •   Patrick Cornelissen    16 年前

    看看循环引用和静态类/变量。这些是IIRC内存泄漏的常见原因。您还应该看看jconsole。

        4
  •  0
  •   デビット    7 年前

    对我来说,设置空的testclass不是解决问题的方法。因为每个测试都在eclipsevm上获取内存,所以最好的事情(为我解决)是终止junit应用程序上下文(通过使用 @DirtiesContext )每堂课都考完了!像下面这样

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @DirtiesContext(classMode=ClassMode.AFTER_CLASS)  // this one
    public class SomeControllerTest {
      ....
    }