Java apachecxf客户端内存

Java apachecxf客户端内存,java,apache,web-services,cxf,Java,Apache,Web Services,Cxf,我们的Apache CXF客户端存在内存问题,因为我们连接到的服务需要WSSE安全性。由于不是线程安全的,端口对象无法在应用程序的不同客户端之间共享。 所以我们使用ApacheCommonsPool2来汇集x个对象。 我们的CXF客户机连接到的服务返回一个非常大和复杂的xml对象,而我们在使用jProfiler时似乎注意到的是 我们正在共享的端口对象仍然有对返回的复杂响应对象的引用,这意味着当我们执行GC时,内存没有被释放,当服务繁忙时,我们会看到内存问题。 首先,这对CXF来说是正常的,其次,

我们的Apache CXF客户端存在内存问题,因为我们连接到的服务需要WSSE安全性。由于不是线程安全的,端口对象无法在应用程序的不同客户端之间共享。 所以我们使用ApacheCommonsPool2来汇集x个对象。 我们的CXF客户机连接到的服务返回一个非常大和复杂的xml对象,而我们在使用jProfiler时似乎注意到的是 我们正在共享的端口对象仍然有对返回的复杂响应对象的引用,这意味着当我们执行GC时,内存没有被释放,当服务繁忙时,我们会看到内存问题。 首先,这对CXF来说是正常的,其次,有没有一种方法可以告诉CXF不要挂起这些引用并清理自己

作为一个非常基本的示例,这是我们在应用程序启动时创建池后如何使用端口

{
    webServicesPT webServicesPT = clientPool.getPort();  // calls borrowObject()

    try {
        webServicesPT.service();
    } finally {
        clientPool.returnPort(webServicesPT); // calls returnObject()
    }
}
任何帮助都将不胜感激


谢谢。

我们的问题与您在这里描述的完全相同。实际上,有趣的是,从ApacheCXF库的角度来看,一切都是合乎逻辑的。该库使用WeakHashMap存储responseContext。映射中使用的键是线程对象本身。因此,由于应用程序在应用程序服务器上使用线程池运行,并且web服务调用来自不同的线程,因此不会从ClientImpl.responseContext WeakHashMap中删除最后一个响应,因为线程本身也不会被垃圾收集。由于您的响应很大,内存已满,看起来是内存泄漏问题

解决方案如下:使用以下代码将服务端口实例返回池时,必须手动清除ResponseText:

ClientProxy.getClient(webServicesPT).getResponseContext().clear();