2009-11-20 7 views
6

패키지의 모든 단위 테스트를로드 할 때 make 태스크는 java.lang.OutOfMemoryError : Java 힙 공간 오류를 발생시킵니다.패키지의 모든 테스트를 실행할 때 JUnit java.lang.OutOfMemoryError

각 하위 패키지에서 모든 테스트를 실행하면 모든 테스트가로드되고 완료됩니다. OOM 오류가 발생하는 상위 패키지에서 모든 테스트를 실행하려고 할 때만 발생합니다.

VM 매개 변수를 조정하면이 문제를 해결할 수 있다고 생각하지 않습니다. 최대 힙 및 파마 크기를 늘리려고했는데 문제가 해결되지 않았습니다.

이렇게하면 여러 패키지에서 로딩 테스트간에 가비지 수집에 문제가 있거나 너무 많은 클래스 로딩이 진행되고 있다고 생각하게됩니다.

이러한 문제를 처리 할 수있는 JUnit 설정이 있습니까? 아니면 테스트 사례에서 코드를 변경하거나 추가하여 문제를 해결해야합니까?

+0

테스트 클래스의 통계 또는 테스트 클래스에서 가져온 통계에 중요한 메모리가 없다고 확신합니까? – bmargulies

+1

실제로 VM 매개 변수를 조정 한 적이 있습니까? java.lang.Runtime의 메소드에 의해 올바르게 설정되었는지 확인하십시오. – Bozho

+0

정적의 메모리 소비에 대해 잘 모르겠습니다 만, 확실히 살펴 보겠습니다. VM 매개 변수에 대해서는 다음과 같이 시도했습니다. -Xmx512m -XX : PermSize = 128m -XX : MaxPermSize = 512m 그러나 OOM 오류를 해결하는 데는 도움이되지 않았습니다. –

답변

3

CPU가 여유 시간이 있거나 여유 메모리가 부족할 때 GC가 실행됩니다. 테스트가 중단되면 어딘가에서 메모리 누수가 발생할 수 있습니다. (네, 그것도 자바에 존재합니다)

순환 참조와 정적 클래스/변수를 찾아보십시오.이 책은 IIRC의 메모리 누출에 대한 일반적인 이유입니다. jconsole도 살펴 봐야합니다.

9

테스트 클래스의 모든 필드를 nulltearDown()으로 설정해야합니다.

JUnit은 테스트 당 하나의 인스턴스 인 을 인스턴스화합니다.. 테스트 결과 (성공, 실패, 스택 추적)를 저장하기 위해 인스턴스 전체를 유지합니다. 따라서 필드를 사용하는 경우 필드가 남아 있고 메모리가 부족합니다.

+0

멋지다, 먼저이 수정 프로그램을 테스트 해 보겠습니다. –

+0

아쉽게도이 방법으로는 문제가 해결되지 않았습니다. tearDown()은 모든 클래스가로드 된 후에 호출되고 테스트가 실행되기 시작합니까? 테스트가 실행되기도 전에 OOM 오류가 Make 작업 중에 발생합니다. –

+0

아니요, 개별 테스트가 끝난 후 tearDown이 호출됩니다. 하지만 "Make 작업"에서 빠졌습니다. 무슨 일로 당신이 얘기하고 있니? 개미를 사용하고 있습니까? 또는 GNU Make? –

4

TestNG를 사용하여 비슷한 문제가 발생하여 콘솔에 생성되는 로그 정보의 양을 추적했습니다. 일단 이것을 줄이면 메모리 문제없이 테스트 스위트를 실행할 수있었습니다.

+0

JUnit 및 maven으로 테스트를 실행하는 것과 동일한 문제를 관찰했습니다. 로그 레벨이 DEBUG이고 OOM 오류가 발생했습니다. ERROR로 전환 한 후 문제가 해결되었습니다. – Rich

관련 문제