我通过build.xml在Jenkins中运行Junit测试用例。当我运行一个特定的测试用例时,我得到以下错误。
<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)
下面是我用来运行junit testcase build.xml的build.xml代码
<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"/>
但是此错误仅在特定系统中发生。不是在所有环境中。我不知道如何摆脱这个。有没有人遇到类似的问题?任何帮助都将非常感激。
答案 0 :(得分:2)
不看测试,很难帮助你,但我的猜测是,无论你使用什么都很大,特别是如果它涉及到构建字符串。一些建议可以帮助您:
StringBuilder class
来构建响应。我注意到在构建一个大字符串时使用“+”符号会有很大的不同。我会尝试检查并更改代码,而不是更改内存设置。尽可能增加JVM的内存,但初始内存设置很小是有原因的。我认为这是因为开发人员不应该只编写内存失控程序,而应该注意构建在大多数环境中运行的程序,包括内存受限的程序。
答案 1 :(得分:2)
从大多数情况下,从OOM的堆栈跟踪开始会产生误导,因为一旦堆几乎满了,任何对象分配都可能是失败的。
增加堆可能有所帮助,但是你的用例(测试评论中提到的一些验证)听起来应该不需要ram演出。
如果您想快速回答,请使用一些工具。包括JVM arg:
<jvmarg value="-XX:+HeapDumpOnOutOfMemoryError"/>
,一旦堆被转储,就在Eclipse Memory Analyzer Tool中打开它,看看是什么占用了内存。这是一个非常好的工具,您可以在几分钟内发现问题(对于更简单的情况)。
一个提示:如果您的测试类使用SpringJUnit4ClassRunner
加载测试上下文,Spring将缓存运行期间加载的所有上下文。如果您有十几个具有不同上下文的集成测试,那么很有可能耗尽512m堆。
答案 2 :(得分:0)
请尝试增加堆空间?