当前位置: 首页 > 面试题库 >

如何提高使用JAXBContext.newInstance操作的应用程序的性能?

韩弘阔
2023-03-14
问题内容

我在基于JBoss的Web应用程序中使用JAXBContext.newInstance操作。据我了解,此操作非常繁重。我只需要Marshaller类的两个唯一实例。

我最初的建议是要有一个静态初始值设定项块,该类将在加载类时仅初始化一次这两个实例:

public class MyWebApp {
    private static Marshaller requestMarshaller;
    private static Marshaller responseMarshaller;

    static {
        try {
            // one time instance creation
            requestMarshaller = JAXBContext.newInstance(Request.class).createMarshaller();
            responseMarshaller = JAXBContext.newInstance(Response.class).createMarshaller();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    private void doSomething() {
            requestMarshaller.marshall(...);
            responseMarshaller.marshall(...);
            ...
    }

}

如果这是一个合理的解决方案,那么我想我会回答自己的问题,但是我想知道这是否是正确的方法?


问题答案:

JAXB实现(Metro,EclipseLink
MOXy
,Apache
JaxMe
等)通常在JAXBContext.newInstance调用期间初始化其元数据。所有OXM工具都需要在某个时候初始化映射元数据,并尝试最小化此操作的成本。由于不可能用零成本做到这一点,因此最好只做一次。JAXBContext的实例是线程安全的,因此,您只需创建一次即可。

根据JAXB 2.2规范的第4.2节JAXB上下文:

为了避免创建JAXBContext实例所涉及的开销,鼓励JAXB应用程序重用JAXBContext实例。抽象类JAXBContext的实现必须是线程安全的,因此,应用程序中的多个线程可以共享同一JAXBContext实例。

Marshaller和Unmarshaller的实例不是线程安全的,并且不能在线程之间共享,它们的创建是轻量级的。



 类似资料:
  • 在Joshua Bloch的有效JAVA中,当我阅读静态工厂方法时,有一个声明如下 静态工厂方法从重复调用中返回相同对象的能力允许类在任何时候对存在的实例保持严格控制。这样做的类称为实例控制类。编写实例控制类有几个原因。实例控件允许类保证它是单实例(第3项)或不可实例化(第4项)。此外,它允许一个不可变类(项目15)保证不存在两个相等的实例:a.equals(b)当且仅当a==b。如果一个类做出此

  • 我正在开发一个应用程序,它有rest API调用和4个选项卡,使用页面滑动选项卡条,但我的问题是,当我从左向右移动选项卡时,显示页面已经太晚了,并点击了5到8秒为什么?这里我用的是碎片。我的应用程序很像what’s应用程序。 提前谢谢`

  • 我正在编写一些调用和几千次的代码。显然这是非常缓慢的,因为反射。 我想看看是否可以在Java7中使用来提高性能。到目前为止,我有以下资料: 不是,而是: 但是,这似乎并不比使用反射的field.set调用执行得更好。我是不是做错什么了? 我读到使用可能更快,但当我尝试使用它时,我得到了一个。 是否有人成功地优化了对field.set或field.get的重复调用?

  • 问题内容: 我正在编写一些可调用的代码,并且执行了数千次。显然,由于反射,这非常慢。 我想看看是否可以在Java 7中使用以提高性能。到目前为止,这里是我所拥有的: 代替,我在做: 但是,这似乎并不比使用反射的Field.set调用更好。我在这里做错什么了吗? 我读到使用可能会更快,但是当我尝试使用它时,得到了。 有谁成功地优化了对Field.set或Field.get的重复调用? 问题答案: 2

  • 我正在开发和运行基于groovy的Jenkins管道作业,我们的代码执行多个线程,需要高CPU和内存。 由于JProfiler是一个功能强大的Java评测工具,因此我想在Jenkins管道作业中收集有关我的groovy代码的性能信息,这些作业在代理上运行,因此我将能够排除代码缺陷并优化代码。 安装JProfiler的最佳实践是什么?(远程KVM或在Jenkins或本地代理上?)

  • 问题内容: 我想使用BigDecimal来表示任意精度的数字,例如在每秒处理数千个订单和执行报告的低延迟交易应用程序中的价格和金额。 我不会对它们进行很多数学运算,因此问题不关乎BigDecimal本身的性能,而是关乎BigDecimal对象的数量会影响应用程序的性能。 我担心的是,大量短暂的BigDecimal对象会给GC造成压力,并导致CMS收集器中更大的Stop-The-World停顿-这绝