Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建大型XML时出现内存不足错误_Java_Xml_Memory Management - Fatal编程技术网

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

Java 创建大型XML时出现内存不足错误,java,xml,memory-management,Java,Xml,Memory Management,原因:java.lang.OutOfMemoryError:java堆空间 位于java.lang.AbstractStringBuilder.expandCapacityUnknown Source 位于java.lang.AbstractStringBuilder.appendUnknown Source 位于java.lang.StringBuffer.appendUnknown Source 位于java.io.StringWriter.writeUnknown源 在com.ctc.ws

原因:java.lang.OutOfMemoryError:java堆空间 位于java.lang.AbstractStringBuilder.expandCapacityUnknown Source 位于java.lang.AbstractStringBuilder.appendUnknown Source 位于java.lang.StringBuffer.appendUnknown Source 位于java.io.StringWriter.writeUnknown源 在com.ctc.wstx.sw.BufferingXmlWriter.FlushBufferingXmlWriter.java:1358 在com.ctc.wstx.sw.BufferingXmlWriter.flushBufferingXmlWriter.java:224 com.ctc.wstx.sw.BufferingXmlWriter.closeBufferingXmlWriter.java:198 位于com.ctc.wstx.sw.BaseStreamWriter.\u finishDocumentBaseStreamWriter.java:1429 位于com.ctc.wstx.sw.BaseStreamWriter.closeBaseStreamWriter.java:264 位于org.codehaus.stax2.ri.Stax2EventWriterImpl.closeStax2EventWriterImpl.java:178 位于org.utils.JcoFunctionToXmlTransformer.transformJcoFunctionToXmlTransformer.java:163

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

当数据非常庞大时,如果行数超过25000,则会出现上述错误
我们面临着同样的问题,即使在使用Jco API方法转换为XML,以及使用外部自定义代码使用Stax API逐节点读取并以XML形式传输时,您是否在运行应用程序时增加了Java上的VM选项?例如:

java -Xmx1024m ...
给它一个千兆字节的堆空间


如果这是在应用服务器或Web容器中,您通常会在配置文件或启动脚本中找到这些选项。

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

java -Xmx1024m ...
给它一个千兆字节的堆空间


如果是在应用服务器或Web容器中,您通常会在配置文件或启动脚本中找到这些选项。

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

java -Xmx512m ...

或者你需要的任何尺寸

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


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

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

java -Xmx512m ...

或者你需要的任何尺寸

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


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

Dó您经常使用大字符串的子字符串吗


连接jvisualvm以查看您的内存去向

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


连接jvisualvm以查看您的内存去向

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

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

将有助于

java-Xmx512m


这可能会有所帮助

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

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

有些情况下,即使堆大小为1GB,也会抛出内存不足错误;有些情况下,即使堆大小为1GB,也会抛出内存不足错误!由于某些原因,注释至少需要15个字符,这已经不是以前的情况了…显示代码!由于某些原因,注释至少需要15个字符,这已经不是以前的情况了……如果它使用Stax2EventWriterImpl来编写,则可能会使用pull解析器来读取XML。相比之下,SAX不会节省那么多内存。@Jimmy,VTD要求XML文档在内存中保持原封不动。这在大型文件中是如何工作的?如果它使用Stax2EventWriterImpl来编写,它将
可能使用拉式解析器来读取XML。相比之下,SAX不会节省那么多内存。@Jimmy,VTD要求XML文档在内存中保持完好无损。这在巨大的文件中如何工作?dó的发音是否不同?我用我的iPhone写了这条评论,它是为丹麦语而不是英语设置的,iPhone的拼写更正作用于空格。因此,发生了一些有趣的更正,但我并不总能理解。我的错。dó的发音不同吗?我用我的iPhone写了这条评论,它是为丹麦语而不是英语而设置的,iPhone的拼写更正作用于空间。因此,发生了一些有趣的更正,但我并不总能理解。我的错。