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的话,也会造成内存泄露。 --------------------编程问答--------------------
关键客户端的代码我使用cxf的wsdl2java工具生成的,ArrayList是否释放是由wsdl2java生成的代码决定额~ --------------------编程问答--------------------
这个是生成了很多的JaxWsProxyFactoryBean,但是主要问题是JaxWsProxyFactoryBean这个为什么不能被释放?是否是cxf的代码问题呢?就算创建一次它也没有办法被自动释放的 --------------------编程问答-------------------- 各位大神帮帮忙! --------------------编程问答-------------------- 您好,请问您这个问题解决了吗?我现在遇到同样的问题,如果您解决了,麻烦指点一下,我的邮箱:weichengke@yeah.net万分感谢! --------------------编程问答--------------------
没解决,不知道怎么解决,解决了互相通知一下啊 --------------------编程问答-------------------- 箭头朝上?这个是被引用关系图啊。
应该看引用关系图啊。
补充:Java , Web 开发