【问题标题】:OutOfMemoryError when parsing large xml file using xstream使用 xstream 解析大型 xml 文件时出现 OutOfMemoryError
【发布时间】:2023-08-15 04:34:02
【问题描述】:

我在读取大型 XML 文件“100 MB”并使用 xstream 解析它时遇到问题,总是会出现以下错误

java.lang.OutOfMemoryError: Java heap space error occurs,

这是解析 XML 的代码

XStream xstream = new XStream();
xstream.processAnnotations(Class.forName((String)ClassName));

ClassName 是一个普通的类,其字段带有 xml 注释。

然后使用

Object resultDto = xstream.fromXML((String)fileString);

fileString: 是读取后的xml文件作为输入流放入字符串缓冲区。

上面的代码适用于小文件,但不适用于大文件,请问有什么想法吗?

【问题讨论】:

  • XStream 构造函数可以有一个参数,指定要使用的 xml 解析器的类型,我想,也许这对你有帮助(不要一次将整个 xml 加载到内存中):xstream.codehaus.org/tutorial.html

标签: java xml marshalling xstream unmarshalling


【解决方案1】:

不要将您的文件转换为字符串然后使用 Xstream,而是直接使用输入流或文件阅读器。 XStream.fromXML 接受各种输入,如 File、InputStream、FileReader 直接操作,无需先将 File 的文本表示形式加载到内存中作为 String。

【讨论】:

    【解决方案2】:

    RAM 大小是多少?如果您有更多 RAM,请使用 -

    为 JVM 分配更多内存
    Xms512m -Xmx2g -XX:PermSize=512m  -XX:MaxPermSize=2g
    

    如果你有 8GB 的​​ RAM,你可以像上面的例子一样分配 2GB 最大堆内存和 2GB 最大 PermGen 空间,所以总共 4GB。或者相应地根据你的 RAM

    【讨论】:

      【解决方案3】:

      据我所知,有两种解决方案:

      1. 增加堆空间。
      2. 使用 SAX 解析器而不是 DOM 解析器(不确定您是否可以使用 xstream 做到这一点)。

      最后,数据可能太大而无法容纳。

      【讨论】:

        【解决方案4】:

        尝试增加你的 java 头记忆。 如果您使用的是日食。 然后是eclipse,ini文件在那里,

        增加头部尺寸。

        -XX:MaxPermSize=1024m
        -Xms512m
        -Xmx1024m
        

        【讨论】:

          【解决方案5】:

          你能用运行时参数运行你的解析程序吗? 在这种情况下,添加参数 -xmx512M -xms512M 应该可以解决问题,因为它会增加堆大小。

          【讨论】:

            最近更新 更多