【发布时间】:2009-11-16 22:22:16
【问题描述】:
我正在使用 JAXB 进行 xml 解析,是否存在任何性能或内存使用问题?
【问题讨论】:
我正在使用 JAXB 进行 xml 解析,是否存在任何性能或内存使用问题?
【问题讨论】:
需要注意的一点是JAXBContext.newInstance() 是一个非常缓慢的操作。这是发生大量反射和类生成的地方,导致 duffymo 提到的烫发空间问题。值得庆幸的是,JAXBContext 是线程安全的,所以可以使用cache one away and reuse it。否则,我认为可以肯定地说 JAXB 内存使用量将与完整的 DOM 相当(或者可能更少),当然,也比 SAX 更大。
如果您有非常大的文档,可以process them in chunks with JAXB。 JAXB RI distribution 包含一个使用 JAXB 进行流式传输的示例。
【讨论】:
JAXB 与基于 DOM 的解析存在相同的基本问题,即一般来说,整个数据数据结构同时保存在内存中。也就是说,它通常比 DOM API 占用更少的内存(XOM 可能例外)。
话虽如此,如果需要,还有一些方法可以使用 JAXB 以面向流的方式读取大型文档的片段。不过,这是相当奇特的用法。
【讨论】:
由于过多的对象创建/销毁,您可能确实会遇到 Java XML 数据绑定的性能和内存问题,this article 可能会有所帮助 解释一种可能有助于避免这些问题的新数据绑定技术
【讨论】:
JAXB 有一个额外的问题,即使用反射来创建在运行时添加到您的 perm 空间的类。可能会出现 OutOfMemoryError 混乱。
【讨论】:
我已经看到,与 Java 中更“简单”的 XML 处理机制(例如 Xerces SAXParser)相比,JAXB 的性能会受到相当严重的影响。
【讨论】:
在 JVM 下面添加参数可以解决这个问题(对性能有轻微影响)
-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
【讨论】: