7

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

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

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

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

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

4

4 回答 4

11

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

原因是 JUnit 为每个测试实例化一个测试类实例。它一直保留该实例以保存测试结果(成功、失败、堆栈跟踪)。因此,如果您使用字段,它们将保留下来,您将耗尽内存。

于 2009-11-20T15:27:02.737 回答
4

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

于 2009-11-20T16:01:40.420 回答
3

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

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

于 2009-11-20T15:19:41.243 回答
2

对我来说,设置 null testclass 并不能解决问题。因为每个测试都在 eclipse vm 上占用内存,所以最好的事情(为我解决)是@DirtiesContext为每个测试类杀死 junit 应用程序上下文(通过使用)完成!像下面

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)  // this one
public class SomeControllerTest {
  ....
}
于 2019-03-27T07:39:01.887 回答