2017-04-13 61 views
2

我有一个使用CXF来调用Web服务的Java应用程序。启动器的代码看起来像 使用JaxWsProxyFactoryBean在Java和Spring中发生内存泄漏

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以某种方式建立在每次调用一个新的服务配置对象,并没有被释放。我在org.apache.cxf.jaxws.support.JaxWsServiceConfiguration类中找不到很多信息,不确定这是一个配置问题还是某个库中的某个内部错误。

回答

2

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

基本上.create()在同一JaxWsProxyFactoryBean实例方法只能调用一次,否则你会得到一个内存泄漏:

return factoryBean.create(); 

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