创建大量XML时出现内存不足错误

Kir*_*iru 1 java xml memory-management

引起:java.lang.OutOfMemoryError:java.lang上的java.lang.AbstractStringBuilder.append(未知来源)java.lang.AbstractStringBuilder.append(未知来源)的Java堆空间java.lang.StringBuffer.append(未知来源) com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer(BufferingXmlWriter.java:1358)的com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:224)中的.io.StringWriter.write(未知来源) .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.utils.JcoFunctionToXmlTransformer.transform上的org.codehaus.stax2.ri.Stax2EventWriterImpl.close(Stax2EventWriterImpl.java:178)(JcoFunctionToXmlTransformer.java:163

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

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

Jim*_*ans 9

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

java -Xmx512m ...
Run Code Online (Sandbox Code Playgroud)

要么

java -Xmx1024m ...
Run Code Online (Sandbox Code Playgroud)

或者你需要的任何尺寸.

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

我在今年早些时候遇到过类似的情况,我将XML生成为StringBuffer,然后将StringBuffer写入HTTP响应OutputStream.这工作正常,直到有人要求200Mb的XML!我很快改变了代码,直接生成XML到OutputStream,不仅节省了内存,还节省了CPU.


rsp*_*rsp 6

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