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

Sim*_*wer 6 java junit unit-testing out-of-memory

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

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

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

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

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

Aar*_*lla 9

必须设置测试类的所有字段nulltearDown().

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


Pat*_*sen 3

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

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