【问题标题】:Out of memory error while creating huge XML创建大型 XML 时出现内存不足错误
【发布时间】:2009-12-01 07:21:50
【问题描述】:

原因:java.lang.OutOfMemoryError: Java heap space 在 java.lang.AbstractStringBuilder.expandCapacity(未知来源) 在 java.lang.AbstractStringBuilder.append(未知来源) 在 java.lang.StringBuffer.append(未知来源) 在 java.io.StringWriter.write(未知来源) 在 com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer(BufferingXmlWriter.java:1358) 在 com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:224) 在 com.ctc.wstx.sw.BufferingXmlWriter.close(BufferingXmlWriter.java:198) 在 com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1429) 在 com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:264) 在 org.codehaus.stax2.ri.Stax2EventWriterImpl.close(Stax2EventWriterImpl.java:178) 在 org.utils.JcoFunctionToXmlTransformer.transform(JcoFunctionToXmlTransformer.java:163

目标 - 将 SAP 返回的 JcoTable 形式的数据转换为 XML。
问题 - java.lang.OutOfMemoryError: Java 堆空间。

当数据非常庞大时,如果行数超过 25,000 会出现上述错误 我们面临同样的问题,即使在使用 Jco API 方法转换为 XML 并且还使用外部自定义代码(使用 Stax API)逐节点读取并作为 XML 流式传输时

【问题讨论】:

  • 显示代码! (由于某种原因,cmets 至少需要 15 个字符)
  • “巨大”已经不是以前的样子了……

标签: java xml memory-management


【解决方案1】:

您可以通过以下方式增加 JVM 的内存限制:

java -Xmx512m ...

java -Xmx1024m ...

或您需要的任何尺寸。

请注意,您可能需要修改您的算法,例如,将 XML 直接序列化到 OutputStream,而不是先构建一个巨大的内存结构,然后将 序列化到 OutputStream。 (这一切都取决于代码在做什么的细节。)

今年早些时候我有一个类似的案例,我将 XML 生成到 StringBuffer,然后将 StringBuffer 写入 HTTP 响应 OutputStream。在有人要求 200Mb 的 XML 之前,这一直很好用!我很快修改了代码,将 XML 直接生成到 OutputStream,不仅节省了内存,还节省了 CPU。

【讨论】:

    【解决方案2】:

    如果您需要解析大型 XML 文件(并且添加到 Java 堆中并不总是有效),您需要一个 SAX 解析器,它允许您解析 XML 流,而不是将整个 DOM 树加载到内存中。

    【讨论】:

    • 如果它使用 Stax2EventWriterImpl 编写它可能会使用拉解析器来读取 XML。相比之下,SAX 不会节省那么多内存。
    • @Jimmy,“VTD 要求 XML 文档在内存中保持原样”如何处理大文件?
    【解决方案3】:

    你经常使用大字符串的子字符串吗?

    附上 jvisualvm 看看你的记忆去哪儿了。

    【讨论】:

    • 的发音不同吗?
    • 我用我的 iPhone 写了该评论,它设置为丹麦语,而不是英语,并且 iPhone 拼写更正作用于 SPACE。因此,发生了一些我并不总是发现的“有趣”更正。我的错。
    【解决方案4】:

    您在运行应用程序时是否增加了 Java 上的 VM 选项?例如:

    java -Xmx1024m ...
    

    给它一个千兆字节的堆空间。

    如果这是在应用服务器或 Web 容器中,您通常会发现此类选项隐藏在配置文件或启动脚本中。

    【讨论】:

    • 有些情况下即使堆大小为 1GB 也会抛出内存不足的错误
    【解决方案5】:

    java -Xmx512m ...

    会有所帮助

    【讨论】:

      【解决方案6】:

      假设您正在将 XML 文档写出到流中,在这种情况下,您不需要将整个 xml 文档保存在内存中,因为您可以在构造它时将其写出到流中。

      【讨论】:

        猜你喜欢
        • 2014-05-10
        • 1970-01-01
        • 2019-08-23
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 2018-06-04
        相关资源
        最近更新 更多