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格式流
您可以通过以下方式增加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.
| 归档时间: |
|
| 查看次数: |
4961 次 |
| 最近记录: |