当前位置:编程学习 > JAVA >>

cxf 内存泄露问题

public class WSClientFactoryDX { 
        private static final WSClientFactoryDX instance = new WSClientFactoryDX(); 
        private static JaxWsProxyFactoryBean dxCicFactoryBean; 

        static { 
                WsClientAuthHandler wsClientAuthHandler; 
                try { 
                        dxCicFactoryBean = new JaxWsProxyFactoryBean(); 
                        dxCicFactoryBean.setServiceClass(ICICService.class); 
                        dxCicFactoryBean 
                                        .setAddress("https://cic.dealextreme.com/v2.0/Services/CICService.svc"); 
                        if (true) { 
                                dxCicFactoryBean.getOutInterceptors().add( 
                                                new LoggingOutInterceptor()); 
                                dxCicFactoryBean.getInInterceptors().add( 
                                                new LoggingInInterceptor()); 
                        } 
                        Map<String, Object> cicMap = new HashMap<String, Object>(); 
                        cicMap.put(WSHandlerConstants.ACTION, 
                                        WSHandlerConstants.USERNAME_TOKEN); 
                        cicMap.put(WSHandlerConstants.USER, "Username"); 
                        cicMap.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 
                        wsClientAuthHandler = new WsClientAuthHandler(); 
                        wsClientAuthHandler.setUsername(""); 
                        wsClientAuthHandler.setPassword(""); 
                        cicMap.put(WSHandlerConstants.PW_CALLBACK_REF, wsClientAuthHandler); 
                        WSS4JOutInterceptor cicWSSOut = new WSS4JOutInterceptor(cicMap); 
                        dxCicFactoryBean.getOutInterceptors().add(cicWSSOut); 
                } catch (Exception ex) { 
                        System.out.print("===method : WSClientFactoryDX Static ERROR===" 
                                        + ex.getMessage()); 
                } 
        } 

        public static WSClientFactoryDX getInstance() { 
                return instance; 
        } 

        private WSClientFactoryDX() { 
        } 
        
        public ICICService getDXCICProxyFacgtoryBean() { 
                return (ICICService) dxCicFactoryBean.create(); 
        } 
        
        public static void main(String[] args) { 
                int mb = 1024*1024; 
                //Getting the runtime reference from system  
                Runtime runtime = Runtime.getRuntime(); 
                System.out.println("Max Memory:" + runtime.maxMemory() / mb+"M"); 
                
                while(true) { 
                        ICICService icicService = WSClientFactoryDX.getInstance().getDXCICProxyFacgtoryBean(); 
                        try { 
                                vRes = icicService.verifyCustomer(vReq); 
                        } catch (Exception ex) { 
                                
                        } finally { 

                        } 
                        
                        System.out.println("Total Memory:" + runtime.totalMemory() / mb+"M"); 
                } 
        } 

其中业务代码删除了,主要的代码都在里面。我用这个代码出现了下图的报错 

我觉得是dxCicFactoryBean.create创建的对象不能被gc回收,导致内存持续增长。我用mat生成的内存图
--------------------编程问答-------------------- 没人知道啊? --------------------编程问答--------------------

dxCicFactoryBean.create()

这个只需要创建一次,你循环创建了JaxWsProxyFactoryBean。 --------------------编程问答-------------------- 看你的第二幅图,JaxWsProxyFactoryBean这个类里应该是有个ArrayList类型的属性的。

vRes = icicService.verifyCustomer(vReq); 
在执行的过程中,JaxWsProxyFactoryBean的ArrayList的属性是否一致在扩充没有释放?

一般ArrayList的属性如果是static修饰的就很容易出这个问题。

--------------------编程问答-------------------- 要保证JaxWsProxyFactoryBean里ArrayList里放的变量,用完就释放,最好的方法就是用临时变量。

另外如果static修饰了ArrayList,而你不清空ArrayList的话,也会造成内存泄露。 --------------------编程问答--------------------
引用 4 楼 u010255083 的回复:
要保证JaxWsProxyFactoryBean里ArrayList里放的变量,用完就释放,最好的方法就是用临时变量。

另外如果static修饰了ArrayList,而你不清空ArrayList的话,也会造成内存泄露。

关键客户端的代码我使用cxf的wsdl2java工具生成的,ArrayList是否释放是由wsdl2java生成的代码决定额~ --------------------编程问答--------------------
引用 2 楼 leecyz 的回复:
Java code?1dxCicFactoryBean.create()
这个只需要创建一次,你循环创建了JaxWsProxyFactoryBean。

这个是生成了很多的JaxWsProxyFactoryBean,但是主要问题是JaxWsProxyFactoryBean这个为什么不能被释放?是否是cxf的代码问题呢?就算创建一次它也没有办法被自动释放的 --------------------编程问答-------------------- 各位大神帮帮忙! --------------------编程问答-------------------- 您好,请问您这个问题解决了吗?我现在遇到同样的问题,如果您解决了,麻烦指点一下,我的邮箱:weichengke@yeah.net万分感谢! --------------------编程问答--------------------
引用 8 楼 eyefamily 的回复:
您好,请问您这个问题解决了吗?我现在遇到同样的问题,如果您解决了,麻烦指点一下,我的邮箱:weichengke@yeah.net万分感谢!

没解决,不知道怎么解决,解决了互相通知一下啊 --------------------编程问答-------------------- 箭头朝上?这个是被引用关系图啊。
应该看引用关系图啊。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,