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回收其内存以及由于jaxb错误而保留的Unmarshaller文档的内存。