2012-03-19 47 views
1

从v6迁移应用程序到WebSphere v8并开始获取内存泄漏。主要的嫌疑人是org.apache.axis2。它看起来每次应用程序调用Web服务时,称为ServiceClient的对象都由WAS8创建,并存储在名为ClientConfigurationContextStore的东西中,然后永远不会被垃圾收集。有没有人有类似的问题?IBM WebSphere 8内存泄漏与Axis2 Web服务

+0

想必您将Axis用作外部库?您是否考虑过使用WAS的内置Web Service支持,如JAX-WS?它的实现基于Axis,但可能会更可预测(和支持)。 – dbreaux 2012-03-20 14:21:22

+0

是的,应用程序使用Axis。但在过去的10年中,这是一个巨大的遗留应用程序,在整个代码中大量的商业逻辑被编写/修改/修补。所以我宁愿不改变代码,但调整环境。 – 2012-03-20 23:42:26

回答

1

通过将原始轴1.4强制转换为提供的soap实现来解决此问题。这是通过将两个文件放在应用程序的WEB-INF /服务中完成的。第一个文件名为javax.xml.soap.MessageFactory,包含'org.apache.axis.soap.MessageFactoryImpl',第二个文件名为javax.xml.soap.SOAPConnectionFactory,包含'org.apache.axis.soap.SOAPConnectionFactoryImpl'。所以现在在代码中:javax.xml.soap.SOAPConnectionFactory.newInstance()在返回com.ibm.ws.webservices之前返回一个org.apache.axis的东西。没有内存泄漏了。

0

如果您在WebSphere v6中没有问题,则可能是v8中的泄漏。但是v8也可能对v6让你逃避的东西更为严格。

您是否检查过您正在重用所有可以使用的Axis2客户端对象,而不是在每次调用时重新创建不需要重新创建的对象?我记得我们在WAS v6.1下的Axis2客户端代码中存在一些泄漏,并意识到我们正在重新创建可以重用的对象。

0

在我们的一个项目中,我们使用Axis2 1.6.2作为服务客户端。应用程序服务器是WebSphere 7,并且在测试环境中时常发生内存不足的情况。当我检查堆转储AxisConfiguration类有很多AxisService类实例。我正在为每个请求实例化ServiceClient,并且我发现有时垃圾收集工作起来很晚才能完成此对象。所以我们使用ServiceClient单例解决了我们的问题。