带有DOM的java.lang.OutOfMemoryError

时间:2013-05-01 19:57:02

标签: java xml dom testing

我正在尝试测试不同的解析器,当我尝试解析70 MB xml文件时,我遇到了DOM问题。错误是java.lang.OutOfMemoryError 我想我的计算机还算不错,所以我不确定是否有问题。

另一个问题。我正在使用秒表来捕捉解析时间,但我想我把秒表.stop放在了错误的地方。我猜它似乎是在

之后
Document document = builder.parse("file.xml"); 

我把它放在for循环之后,打印出所有节点

感谢

4 个答案:

答案 0 :(得分:2)

解决方案取决于您收到的java.lang.OutOfMemoryError类型。如果是PermGen space,则需要将以下参数添加到JVM以设置PermGen(在示例中它将设置为300 MB):

-XX:MaxPermSize=300m

如果是Java Heap Space添加此参数来设置堆空间(在本例中为1 GB):

-Xmx1024m

答案 1 :(得分:2)

如果您使用默认堆大小并解析大型XML文档,则会遇到常见问题。您需要增加JVM的堆大小。执行程序时,在jvm命令中添加参数“-Xmx1024m”(或-Xmx512m或您认为需要的任何内容,堆只占用指定点所需的内存)。

示例:java -Xmx1024m -jar myprogram.jar

这也可以在各种IDE的运行时属性中设置。在eclipse中,它是应用程序的运行配置的“VM参数”部分。

答案 2 :(得分:2)

此外,如果您要处理大型XML文档,您可能想尝试不同的方法。决定因素是您是否需要同时在内存中存储整个文档。为了节省空间,您可以分别解析部分XML。

这称为流式XML解析器。您将需要Google为Java提供一些不同的流式XML解析器。我的第一件事是 StAX ,这是规范。常见的util是 Apache Axiom

http://en.wikipedia.org/wiki/StAX

答案 3 :(得分:0)

另一个建议:您可能需要查看ScaleDOM,它允许解析非常大的XML文件:https://github.com/whummer/scaleDOM

由于XML节点的延迟加载,ScaleDOM的内存占用量很小。它只将XML文档的一部分保留在内存中,并在必要时从源文件重新加载节点。