2013-02-25 3 views
-2

Jenkins에서 build.xml을 통해 Junit 테스트 케이스를 실행 중입니다. 특정 테스트 케이스를 실행할 때 아래 오류가 발생합니다.Junit 테스트 케이스를 실행할 때 OutofMemoryError

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> 
<title>Error 500 Java heap space</title> 
</head> 
<body><h2>HTTP ERROR 500</h2> 
<p>Problem accessing /url. Reason: 
<pre> Java heap space</pre></p><h3>Caused by:</h3><pre>java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2882) 
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100) 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390) 
    at java.lang.StringBuilder.append(StringBuilder.java:119) 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Long.parseLong(Long.java:410) 
    at java.lang.Long.valueOf(Long.java:525) 
    at org.codehaus.jettison.mapped.DefaultConverter.convertToJSONPrimitive(DefaultConverter.java:39) 
    at org.codehaus.jettison.mapped.MappedNamespaceConvention.convertToJSONPrimitive(MappedNamespaceConvention.java:282) 
    at org.codehaus.jettison.mapped.MappedXMLStreamWriter$JSONPropertyObject.withProperty(MappedXMLStreamWriter.java:153) 
    at org.codehaus.jettison.mapped.MappedXMLStreamWriter$JSONProperty.withProperty(MappedXMLStreamWriter.java:66) 
    at org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeEndElement(MappedXMLStreamWriter.java:247) 
    at com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput.endTag(XMLStreamWriterOutput.java:144) 
    at com.sun.xml.bind.v2.runtime.output.XmlOutputAbstractImpl.endTag(XmlOutputAbstractImpl.java:120) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:326) 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1041) 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1020) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:252) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:121) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168) 
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:155) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:324) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315) 

다음은 내가

<target name="runTests"> 
    <junit fork="yes" forkmode="once" printsummary="yes" dir="${basedir}" includeantruntime="yes" failureproperty="failureTest" maxmemory="1024m" jvm=""> 
    <jvmarg value="-XX:MaxPermSize=512M"/> 
    <jvmarg value="-Dlog4j.configuration=log4j.properties"/> 

의 build.xml의 JUnit 테스트 케이스를 실행하는 데 사용 된 build.xml 코드 그러나이 오류는 특정 시스템에서 발생한다. 모든 환경에있는 것은 아닙니다. 나는 이걸 없애는 법을 모른다. 비슷한 종류의 문제에 직면 한 사람이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

실행중인 테스트는 무엇입니까? –

+2

이것은 응답 문자열을 작성하는 동안 발생합니다. 귀하의 응답이 잘못 생성되거나 너무 크다고 생각하십니까? –

+0

@Kata : 약 15 개의 클래스에서 유효성 검사 메소드가 많이 있습니다.이 메소드는 모든 메소드를 호출하고 유효성 검증 오류가 리턴되지 않으면 테스트가 통과합니다. – Mojoy

답변

0

힙 공간을 늘리십시오.

+0

그가 어떻게 그랬을까요? –

+0

@sandy :이 매개 변수는 입니까? – Mojoy

+0

예 -XMX2048m으로 변경하고 시도하십시오. – chiru

2

테스트를 보지 않고는 정말 도움이되지 않지만 제 생각에는 당신이 작업하고있는 것이 무엇이든간에 문자열을 만드는 것이면 큰 것입니다. 몇 가지 제안이 도움이 될 수 있습니다.

  1. StringBuilder class을 사용하여 응답을 만드십시오. 큰 문자열을 만들 때 "+"기호를 사용하는 것보다 makea가 큰 차이점을 발견했습니다.
  2. eclipse.ini에서 eclipse에 사용할 수있는 메모리를 늘리십시오. 좋은 설명은 this 링크에서 찾을 수 있습니다.

메모리 설정을 변경하는 대신 코드를 검사하고 변경하려고합니다. JVM에 배치 된 메모리를 늘릴 수있는만큼 초기 메모리 설정이 작은 이유가 있습니다. 나는 개발자가 메모리 런 어웨이 프로그램을 작성해서는 안되며, 메모리가 제한된 프로그램을 포함하여 대부분의 환경에서 실행되는 프로그램을 설계해야하기 때문에 그렇게 생각한다.

2

힙이 거의 가득 차게되면 개체 할당이 실패 할 수 있기 때문에 OOM의 스택 추적에서 시작하는 것이 대부분 오해의 소지가 있습니다.

힙을 늘리면 도움이 될 수 있지만 사용법 (메모에서 언급 한대로 일부 유효성 검사)은 램을 필요로하지 않는 것처럼 들립니다.

빠른 답변을 원한다면 몇 가지 도구를 사용하십시오. JVM arg : <jvmarg value="-XX:+HeapDumpOnOutOfMemoryError"/>을 포함하고 일단 힙이 덤프되면 Eclipse Memory Analyzer Tool에 열어서 메모리를 얼마나 먹고 있는지 확인하십시오. 아주 좋은 도구로, 몇 분 안에 문제를 발견 할 수 있습니다 (단순한 경우).

팁 : 테스트 클래스가 SpringJUnit4ClassRunner을 사용하여 테스트 컨텍스트를로드하면 Spring은 실행 중에로드 된 모든 컨텍스트를 캐싱합니다. 다른 컨텍스트를 사용하여 12 가지 통합 테스트를 수행하면 512m 힙이 부족할 가능성이 큽니다.

관련 문제