You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:08