【问题标题】:Memory leaks in Java and spring using JaxWsProxyFactoryBean使用 JaxWsProxyFactoryBean 在 Java 和 Spring 中的内存泄漏
【发布时间】:2017-04-13 06:38:48
【问题描述】:

我有一个使用 CXF 调用 Web 服务的 Java 应用程序。发起者的代码看起来像

导入 org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
导入 org.springframework.core.env.Environment;
导入 org.springframework.stereotype.Component;
导入 org.tempuri.IAPIService;

导入 javax.inject.Inject;

/**
 * 由 flavius 于 2014 年 9 月 23 日创建。
 */
@零件()
公共类 VsJaxWsProxyFactory {

  @注入
  私有环境环境;

  私有 JaxWsProxyFactoryBean factoryBean = null;

  公共对象创建(){
    if (factoryBean == null) {

      factoryBean = new JaxWsProxyFactoryBean();
      factoryBean.setServiceClass(IAPIService.class);
      factoryBean.setAddress(env.getProperty("api.wsdl"));
    }
    返回 factoryBean.create();
  }
}

应用程序运行良好,但一段时间后,盒子开始消耗太多内存,应用程序开始运行缓慢。当我们尝试进行内存分析时,我们发现以下内容

似乎 CXF 在每次调用时都会以某种方式创建一个新的服务配置对象,并且没有被释放。我在 org.apache.cxf.jaxws.support.JaxWsServiceConfiguration 类上找不到太多信息,也不确定这是配置问题还是某些库中的一些内部错误。

【问题讨论】:

    标签: java spring memory-leaks cxf


    【解决方案1】:

    已经在这里回答了: Apache CXF not releasing clients

    基本上,同一个 JaxWsProxyFactoryBean 实例上的 .create() 方法应该只调用一次,否则会出现内存泄漏:

    return factoryBean.create();
    

    factoryBean.create() 返回 cxf JAX-WS 客户端代理,您可以将其重用于 repeated 调用。如果您不使用此处提到的任何特殊功能http://cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxiesthreadsafe?

    ,则创建的客户端也是线程安全的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多