如何避免Java中的OutOfMemoryError?

时间:2013-06-10 09:53:26

标签: java java-ee

我是Java新手。我有这个2 GB xml文件,我需要解析它并将其数据存储到数据库中。

StackOverflow上有人建议我将Dom4j用于长xml文件。解析做得很好,但返回的Document(由Dom4j)很长,迭代时将所有DOM对象加载到内存(堆)中。

这会导致内存不足异常。有人可以帮我解决这些错误吗?我们是否在Java中有一些现象用于Java中的按需堆分配和沉积?

2 个答案:

答案 0 :(得分:5)

您有两种选择:

  1. 重新配置您的JVM以分配更多的最大内存(通过-Xmx2g或类似内容)。见here for more info。此选项显然也受到您的操作系统和系统中可用内存量的限制。
  2. 使用流式 API(例如SAX),它不会立即将所有XML加载到您的内存中,而是通过您的流程将其流式传输,允许您分析它没有把整个文档记在内存中
  3. 第一个选项可能会立即为您提供帮助,而不是特定于此问题。第二种选择是更具可扩展性的解决方案,因为它允许您分析任何大小的文档。当然,您需要担心分析结果的内存消耗,但这完全是另一回事。

答案 1 :(得分:1)

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

您也可以查看SAXDOMIX

  

SAXDOMIX包含可以转发SAX事件或DOM子树的类   解析XML文档时的应用程序。该   框架定义了允许应用程序获取的简单接口   SAX解析过程中的DOM子树。处理后,所有DOM   子树有资格进行垃圾收集。这解决了DOM   可扩展性问题。