JAXBContext初始化加速?

Han*_*örr 27 java performance jaxb

有没有办法加速javax.xml.bind.JAXBContexts的初始化(大于1000个类)?在我们的XML繁重的应用程序中,启动时间大约是10分钟,主要包括JAXBContexts的初始化时间.:-(

我们在JDK 1.5和org.jvnet.jaxb2.maven2.maven-jaxb2-plugin中使用Sun的JAXB实现来从XSD生成代码.

澄清:问题不在于我们有许多具有相同上下文路径的JAXBContext实例,但问题是单个JAXBContext的初始化需要几十秒,因为它必须加载和处理数千个类.(我们的XSD相当大且复杂.)所有JAXBContext实例都有不同的上下文路径 - 我们无法进一步减少数量.

ska*_*man 37

由于这个原因,JAXB参考实现具有一种未记录的系统属性:

-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true
Run Code Online (Sandbox Code Playgroud)

或者对于包重构之前的旧版本:

-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true
Run Code Online (Sandbox Code Playgroud)

这指示JAXB跳过预先缓存其完成工作所需的各种反射肌肉的昂贵过程.相反,它将在使用上下文时执行所有反射.这使得运行时间变慢,但初始化速度明显加快,尤其是对于大量类.

但是,速度问题的一部分是不可避免的,而且事实是JAXB必须加载你的每一个类,并且类加载很慢.如果您在第一个上下文后立即创建第二个上下文,使用相同的配置,这是很明显的 - 您已经看到它已经加载了类,它们要快得多.

此外,您说您有多个JAXBContext实例,因为您有多个上下文路径.您是否意识到可以将多个上下文路径放入单个上下文中?初始化上下文时,您只需将它们全部作为以分号分隔的字符串传递,例如

JaxbContext.newInstance("a.b.c:x.y.z");
Run Code Online (Sandbox Code Playgroud)

将加载上下文a.b.cx.y.z.但是,它可能不会对性能产生任何影响.

  • 只是为了澄清,你需要使用冒号来分隔包名,而不是分号.至少使用Sun JAXB RI. (5认同)

Sta*_*Man 6

通常,您不必创建JAXBContext的许多实例,因为它们在配置后是线程安全的.在大多数情况下,只需一个上下文就可以了.

那么为什么创建了许多实例的具体原因呢?也许假设它们不是线程安全的?(这是可以理解的,因为这没有明确记录 - 但它是一种非常常见的模式,需要在配置期间进行同步,但在使用期间不会,只要配置不被更改).

除此之外,如果这仍然是一个问题,在jaxb.dev.java.net(从配置文件指向热点)的分析瓶颈和提交问题将有助于改进.JAXB团队非常好,反应迅速,如果您能够展示问题所在,他们通常会提出良好的解决方案.