JUnit java.lang.OutOfMemoryError when running all

2019-06-19 12:58发布

When loading all unit tests in a package, the make task throws a java.lang.OutOfMemoryError: Java heap space error.

If I run all the tests in each subpackage, though, all tests load and complete just fine. It is only when I try to run all tests in the parent package that the OOM error occurs.

I don't think this problem should be solved by tweaking VM parameters. I tried increasing the maximum heap and perm size, and it didn't solve the problem.

This leads me to believe there is some problem garbage collecting between loading tests in different packages, or that there is some too-eager class loading going on.

Is there a JUnit setting that could take care of these issues, or is the problem going to have to be solved by changing or adding code in the test cases?

4条回答
你好瞎i
2楼-- · 2019-06-19 13:21

I experienced a similar problem using TestNG and traced it to the amount of log information I was generating to the console. Once I'd reduced this I was able to run my test suite without memory problems.

查看更多
一纸荒年 Trace。
3楼-- · 2019-06-19 13:40

The GC runs when the CPU has spare time or the free memory is low. If your tests crash, you might have a memory leak somewhere. (Yes they exist in java too)

Have a look for circular references and static classes/variables.Theses are IIRC common reasons for memory leaks. You should also have a look at jconsole.

查看更多
时光不老,我们不散
4楼-- · 2019-06-19 13:41

You must set all fields of the test classes to null in tearDown().

The reason is that JUnit instantiates one instance of the test class per test. It keeps that instance around for the whole time to save the results of the test (success, failure, stack trace). So if you use fields, they will stay and you'll run out of memory.

查看更多
爷的心禁止访问
5楼-- · 2019-06-19 13:41

For me , setting null testclass is not solving . Coz each test take memory on eclipse vm so the best thing(solve for me) is killing junit application context( by using @DirtiesContext) for each test class are finished ! Like below

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)  // this one
public class SomeControllerTest {
  ....
}
查看更多
登录 后发表回答