2017-04-13 60 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?