在程序包中运行所有测试时的JUnit java.lang.OutOfMemoryError

时间:2009-11-20 15:14:57

标签: java unit-testing junit out-of-memory

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

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

我认为不应该通过调整VM参数来解决这个问题。我尝试增加最大堆和perm大小,但它没有解决问题。

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

是否存在可以解决这些问题的JUnit设置,或者是否需要通过更改或添加测试用例中的代码来解决问题?

4 个答案:

答案 0 :(得分:9)

您必须在null中将测试类的所有字段设置为tearDown()

原因是JUnit实例化了每个测试的测试类的一个实例。它保持该实例在整个时间内保存测试结果(成功,失败,堆栈跟踪)。因此,如果您使用字段,它们将保留,您将耗尽内存。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

当CPU有空闲时间或空闲内存不足时,GC运行。如果您的测试崩溃,您可能会在某处发生内存泄漏。 (是的,它们也存在于java中)

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

答案 3 :(得分:0)

对我来说,设置null testclass不能解决。因为每个测试都会在eclipse vm上占用内存,所以最好的办法(为我解决)是结束每个测试类的junit应用程序上下文(通过使用@DirtiesContext)!如下所示

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