cxf 内存泄露问题

genganpeng 2013-04-21 10:48:40
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生成的内存图
...全文
518 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fei1710 2013-06-02
  • 打赏
  • 举报
回复
箭头朝上?这个是被引用关系图啊。 应该看引用关系图啊。
genganpeng 2013-06-01
  • 打赏
  • 举报
回复
引用 8 楼 eyefamily 的回复:
您好,请问您这个问题解决了吗?我现在遇到同样的问题,如果您解决了,麻烦指点一下,我的邮箱:weichengke@yeah.net万分感谢!
没解决,不知道怎么解决,解决了互相通知一下啊
weickdev 2013-05-21
  • 打赏
  • 举报
回复
您好,请问您这个问题解决了吗?我现在遇到同样的问题,如果您解决了,麻烦指点一下,我的邮箱:weichengke@yeah.net万分感谢!
genganpeng 2013-04-23
  • 打赏
  • 举报
回复
各位大神帮帮忙!
genganpeng 2013-04-22
  • 打赏
  • 举报
回复
没人知道啊?
genganpeng 2013-04-22
  • 打赏
  • 举报
回复
引用 2 楼 leecyz 的回复:
Java code?1dxCicFactoryBean.create() 这个只需要创建一次,你循环创建了JaxWsProxyFactoryBean。
这个是生成了很多的JaxWsProxyFactoryBean,但是主要问题是JaxWsProxyFactoryBean这个为什么不能被释放?是否是cxf的代码问题呢?就算创建一次它也没有办法被自动释放的
genganpeng 2013-04-22
  • 打赏
  • 举报
回复
引用 4 楼 u010255083 的回复:
要保证JaxWsProxyFactoryBean里ArrayList里放的变量,用完就释放,最好的方法就是用临时变量。 另外如果static修饰了ArrayList,而你不清空ArrayList的话,也会造成内存泄露。
关键客户端的代码我使用cxf的wsdl2java工具生成的,ArrayList是否释放是由wsdl2java生成的代码决定额~
火影之贺 2013-04-22
  • 打赏
  • 举报
回复
要保证JaxWsProxyFactoryBean里ArrayList里放的变量,用完就释放,最好的方法就是用临时变量。 另外如果static修饰了ArrayList,而你不清空ArrayList的话,也会造成内存泄露。
火影之贺 2013-04-22
  • 打赏
  • 举报
回复
看你的第二幅图,JaxWsProxyFactoryBean这个类里应该是有个ArrayList类型的属性的。 vRes = icicService.verifyCustomer(vReq); 在执行的过程中,JaxWsProxyFactoryBean的ArrayList的属性是否一致在扩充没有释放? 一般ArrayList的属性如果是static修饰的就很容易出这个问题。
leecyz 2013-04-22
  • 打赏
  • 举报
回复

dxCicFactoryBean.create()
这个只需要创建一次,你循环创建了JaxWsProxyFactoryBean。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧