java.lang.OutOfMemoryError:Java 堆空间 [重复]

Posted

技术标签:

【中文标题】java.lang.OutOfMemoryError:Java 堆空间 [重复]【英文标题】:java.lang.OutOfMemoryError: Java heap space [duplicate] 【发布时间】:2014-12-02 01:59:37 【问题描述】:
java.lang.OutOfMemoryError: Java heap space
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.<init>(UTF8Reader.java:122)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.createReader(XMLEntityManager.java:2344)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:684)
        at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:140)
        at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:123)
        at org.glassfish.jersey.message.internal.XmlRootElementJaxbProvider.readFrom(XmlRootElementJaxbProvider.java:140)
        at org.glassfish.jersey.message.internal.AbstractRootElementJaxbProvider.readFrom(AbstractRootElementJaxbProvider.java:122)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:239)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:211)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:139)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1109)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:785)
        at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:267)
        at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:111)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:397)
        at   org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:108)

我的堆空间是-Xmx256m。这是这个问题的原因吗?如果它增加到 -Xmx2g,它可能会在更多时间后失败。但我认为这不是正确的解决方案。请帮忙。

【问题讨论】:

您是否对应用程序进行了分析以查看内存的使用位置?如果没有,那将是一个很好的第一步。 您的 XML 文件有多大?据我所知,它尝试分配一个缓冲区来读取您的 XML 文件,但内存不足。 发生这种情况时,您可能正在读取 XML 文件。如果 XML 文件继续增长,那么是的,在您将 XML 文件大小增加八倍后,它可能会因 -Xmx2g 而失败。但是如果 XML 文件大小是恒定的或已知的,那么您可以找出您最多需要多少内存。 【参考方案1】:

是的。堆被过度分配。除了增加堆空间之外,解决其他问题的唯一方法是查看正在使用所有堆空间的内容,然后尝试确保可以收集那些停留时间超过需要的对象。如果是文件或无法收集的东西使您耗尽堆空间,那么如果文件大小不是恒定的并不断变化,您应该重新设计您的程序。如果它们是恒定的,只需增加文件大小以上的堆空间。

【讨论】:

以上是关于java.lang.OutOfMemoryError:Java 堆空间 [重复]的主要内容,如果未能解决你的问题,请参考以下文章