最近在做项目的JAXB性能优化,原来Unmarshal平均每条需要1秒以上。经过优化后,平均每条少于2毫秒。
1. 如果使用newInstance(String contextPath)来创建JAXBContext,每次创建时间非常耗时,第一次在2秒以上,后续创建相同参数的JAXBContext需要1秒以上。如果使用这种方式创建JAXBContext,建议通过contextPath来缓存JAXBContext对象。
2. 如果使用newInstance(Class... classesToBeBound)来创建JAXBContext,则创建时间相比上面的要短,第一次250毫秒左右,后续创建相同参数的JAXBContext非常快。不过使用这种方式创建的JAXBContext需要注意一点,你必须非常清楚你要Unmarshal的顶级Class(就是最后的结果Class), 这个Class直接或间接引用的Class在Unmarshal时都不会有问题,如果有未引用到的Class,则会抛出异常。
3. 在Unmarshal时,上述第2种方式创建的JAXBContext要比第1种方式创建的性能好。如果你非常清楚你Unmarshal最后的结果Class,那么可以使用第2种方式创建,否则请使用第1种方式创建JAXBContext。
4. Marshaller实例对象和Unmarshaller实例对象都是非线程安全的,创建非常快,不要在多线程环境下共享这2个实例对象。JAXBContext实例对象是线程安全的,可以放心共享使用。