gpt4 book ai didi

java - JAXB 保留传递给 Marshaller 的对象

转载 作者:行者123 更新时间:2023-11-30 09:50:23 26 4
gpt4 key购买 nike

JAXB 可以很好地进行编码和解码。因为创建编码器和解码器可能很慢,所以为它们使用池(基于 contextPath)似乎是一种合理的方法。但是,似乎 Unmarshaller 在完成后会保留对象。如果传递给它的是一个非常大的文档,那么如果某个特定的 Unmarshaller 有一段时间没有被重用,它可能会占用大量内存。有没有办法让 JAXB 释放它处理过的对象?

JAXBContext jaxBContext = JAXBContext.newInstance(contextPath, loader);
Unmarshaller unMarshaller = jaxBContext.createUnmarshaller();
...
responseObject = unmarshaller.unmarshal( new StreamSource( new StringReader( xml ) ) );

在线有这样的池方法示例(例如 apache 中的一个:JAXBUtils.java)。当他们将 Unmarshaller 放回池中时,大多数人似乎没有做任何特别的事情。

更新:这似乎是 JAXB 中的错误:Post-Unmarshall Object Retention . Marshall 中的类似错误已在较早的时候得到修复,因此它出现在 JAXB 的最新版本中。所以现在我想知道 (a) Unmarshaller 是否有针对此问题的解决方法 (b) 此修复程序包含/将包含在哪个版本的 Java6 中。

最佳答案

我想到的一种解决方法是将 JAXBContext 而非 Un/Marshaller 合并。做一些快速计时,与从 contextPath 创建 JAXBContext 所花费的时间相比,创建 Un/Marshaller 所花费的时间似乎可以忽略不计。通过在池中仅保留对 JAXBContext 的引用,然后应该释放 Unmarshaller,这有望让 GC 回收其内存以及 Unmarshaller 由于 jaxb 错误而持有的文档。

关于java - JAXB 保留传递给 Marshaller 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5186938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com