-3

我正在通过 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 测试用例 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"/>

但是此错误仅在特定系统中发生,而不是在所有环境中发生。我怎样才能摆脱这个?

4

3 回答 3

2

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

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

如果您想快速获得答案,请使用一些工具。包括 JVM arg: <jvmarg value="-XX:+HeapDumpOnOutOfMemoryError"/>,一旦堆被转储,在Eclipse 内存分析器工具中打开它,看看是什么占用了内存。这是一个非常好的工具,您可以在几分钟内发现问题(对于更简单的情况)。

提示:如果您的测试类使用SpringJUnit4ClassRunner加载测试上下文,Spring 将缓存在运行期间加载的所有上下文。如果你有十几个不同上下文的集成测试,你很有可能会用完 512m 堆。

于 2013-02-25T15:03:23.413 回答
2

不看测试,真的很难帮助你,但我猜你正在使用的东西很大,特别是如果它涉及构建字符串。一些建议可以帮助你:

  1. 尝试使用StringBuilder class来构建响应。我注意到在构建大字符串时使用“+”号有很大的不同。
  2. 在 eclipse.ini 中增加可供 eclipse 使用的内存。可以在链接中找到一个很好的解释。

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

于 2013-02-25T14:52:36.460 回答
0

请尝试增加您的堆空间?

于 2013-02-25T14:44:46.440 回答