2013-02-25 150 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) 

下面是build.xml文件的代码,我用它来运行JUnit测试用例的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

您正在运行的测试是什么? – 2013-02-25 14:29:59

+2

构建响应字符串时发生这种情况。考虑到你的回应可能不正确,而且太大? – 2013-02-25 14:31:08

+0

@Kata:我在15个类中有很多验证方法,这个测试会调用所有的方法,如果没有返回验证错误,测试会通过。 – Mojoy 2013-02-25 14:41:01

回答

0

请尝试增加您的heapspace?

+0

他会怎么做? – 2013-02-25 14:46:21

+0

@sandy:这个参数是? – Mojoy 2013-02-25 14:47:00

+0

是更改为-XMX2048m并尝试 – chiru 2013-02-25 14:48:21

2

没有看测试,它真的很难帮助你,但我的猜测是,无论你使用的是什么,尤其是如果它涉及到构建字符串。一些建议可以帮助您:

  1. 尝试使用StringBuilder class来构建响应。我注意到,在构建大型字符串时,使用“+”符号会产生巨大差异。
  2. 增加eclipse.ini中eclipse的可用内存。一个很好的解释可以在this链接中找到。

我会尝试检查并更改代码,而不是更改内存设置。尽管您可以增加置于JVM的内存,但初始内存设置很小的原因是有原因的。我认为这是因为开发人员不应该只编写内存耗尽程序,而应该注意构建在大多数环境中运行的程序,包括内存受限的程序。

2

从OOM的堆栈跟踪开始,在大多数情况下都有误导性,因为一旦堆堆满了,任何对象分配都可能失败。

增加堆可能会有所帮助,但是您的用例(测试您在评论中提到的一些验证)听起来像不应该需要演示ram。

如果您想快速回答,请使用一些工具。包括JVM参数: <jvmarg value="-XX:+HeapDumpOnOutOfMemoryError"/>,一旦堆被倾倒,在Eclipse Memory Analyzer Tool中打开它,看看什么在吞噬内存。这是一个非常好的工具,您可以在几分钟内发现问题(对于更简单的情况)。一个提示:如果您的测试类使用SpringJUnit4ClassRunner加载测试环境,则Spring将缓存运行期间加载的所有环境。如果您针对不同的上下文进行了一打集成测试,那么您很可能会耗尽512m堆。