WebSphere 8.5未使用Axis却出现Axis.Client内存泄漏问题求助
问题根因
- WebSphere 8.5 内置了Axis 1.x作为SOAP服务的默认实现,你调用JDK标准
SOAPConnection接口时,底层实际加载的是WebSphere提供的Axis实现类,所以即便你没有直接引入Axis依赖,也会出现Axis相关对象的内存累积。 - Axis的
SOAPConnection实现存在已知缺陷:调用close()方法时不会主动释放内部Axis.Client实例持有的消息缓冲区、上下文对象等资源,你的代码每次调用都新建SOAPConnection实例,长期运行就会导致大量Axis对象无法被GC回收,最终触发内存溢出。 - 你提供的Jersey Rest调用代码也存在资源泄漏问题:每次调用都新建重量级
Client实例,且调用完成后没有关闭ClientResponse释放流资源,这部分也会加剧内存占用过高的问题。
修复方案
1. 解决Axis相关内存泄漏
优先选择绕开WebSphere的Axis实现,有两种可行方式:
- 显式指定SOAPConnection使用JDK自带的实现,修改SOAP调用代码中工厂初始化逻辑:
// 替换原有的SOAPConnectionFactory初始化代码 SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance("com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory", null);
- 调整WebSphere应用的类加载策略为父类加载器最后(Parent Last),在应用中引入独立的SAAJ实现包,覆盖服务器默认的Axis SOAP实现。
- 可选优化:复用SOAPConnection实例,避免每次调用重复创建对象,降低资源开销。
2. 修复Jersey Rest调用的资源泄漏
- 全局复用同一个
Client实例,不要每次调用都新建:Client是重量级对象,内部持有连接池、线程池资源,全局单例即可满足全应用使用需求。 - 每次调用完成后必须主动关闭
ClientResponse,建议用try-with-resources语法自动释放资源,示例:
try(ClientResponse response = webResource .queryParam("customerId", radical) .queryParam("serviceContext", URLEncoder.encode(mapper.writeValueAsString(serviceContext),"UTF-8")) .post(ClientResponse.class)) { // 处理响应逻辑 }
- 应用停止时调用
client.destroy()方法,释放Client持有的所有底层资源。
3. 快速验证方法
可在测试环境的JVM启动参数中添加:-Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory
重启应用后观察内存增长情况,如果Axis相关对象不再持续累积,即可确认问题定位正确。
内容的提问来源于stack exchange,提问作者hamwac5
相关产品推荐
相关产品推荐

