Java和Spring中的内存泄漏使用JaxWsProxyFactoryBean

时间:2017-04-13 06:38:48

标签: java spring memory-leaks cxf

我有一个Java应用程序,它使用CXF来调用Web服务。启动器的代码看起来像

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

import javax.inject.Inject;

/**
 * Created by flavius on 23/09/14.
 */
@Component()
public class VsJaxWsProxyFactory {

  @Inject
  private Environment env;

  private JaxWsProxyFactoryBean factoryBean = null;

  public Object create() {
    if (factoryBean == null) {

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

应用程序运行正常,但过了一会儿,该框开始消耗太多内存,应用程序开始运行缓慢。当我们尝试进行内存分析时,我们发现了以下内容 Memory Analysis

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

1 个答案:

答案 0 :(得分:2)

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

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

return factoryBean.create();

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