【问题标题】:Memory leak with JAXBJAXB 内存泄漏
【发布时间】:2011-02-24 02:06:51
【问题描述】:

我遇到内存不足错误:

线程“主”java.lang.OutOfMemoryError 中的内存异常:Java 堆空间 在 org.apache.xerces.dom.CoreDocumentImpl.createElement(CoreDocumentImpl.java:564)

我有一个独立的 Java 程序,它从 DB 中获取数据并使用 DOM 创建一个 XML 文件。如果获取的数据很大,我会收到上述错误,在我的情况下,它是 > 1,000,000 条记录。

在从 unix 调用 Java 类时,我已将 2GB 定义为堆大小。

我用 JAXB 进行了尝试,但仍然没有任何显着的改进。

关于如何改进代码的任何建议。

【问题讨论】:

  • 为什么会出现内存泄漏?如果您使用 DOM,您将一次将整个文档加载到内存中。如果文档很大,您的程序将使用大量内存,您可能会得到OutOfMemoryError。该错误并不自动意味着存在内存泄漏。

标签: java dom jaxb out-of-memory


【解决方案1】:

您应该避免一次将整个文件加载到内存中。为此,请从使用 DOM 切换到另一种技术,例如 SAX 或 StAX。它是一种流式 API,因此更适合处理大量 XML 数据。

编辑: SAX 不支持写入,因此这里不适用。

【讨论】:

  • @ Joachim - 我厌倦了 JAXB,但没有看到任何改进。您能否提供一些示例代码如何使用 SAX。我是新手。
  • 我没有推荐 JAXB,但如果你真的想使用它,那么this document 可能会提供有用的提示。
  • 您提供的 SAX 教程是关于解析现有 XML。我正在尝试使用从 DB 获取的数据创建 XML 文件。
  • 我似乎错过了“编写 XML”部分。在这种情况下,SAX 没有帮助,但是 StAX 确实支持以流模式编写 XML,所以这将是您最好的选择。
  • 是的,我现在正在尝试使用 StAX。你知道如何验证针对 xsd 文件创建的 xml 文件吗?
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
  • 2011-03-22
相关资源
最近更新 更多