繁体   English   中英

Apache CXF 客户端内存

[英]Apache CXF Client Memory

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

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

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

    try {
        webServicesPT.service();
    } finally {
        clientPool.returnPort(webServicesPT); // calls returnObject()
    }
}

任何帮助,将不胜感激。

谢谢。

我们遇到了您在此处描述的完全相同的问题。 实际上有趣的部分是,从 Apache CXF 库的角度来看,一切都是合乎逻辑的。 该库使用 Wea​​kHashMap 来存储 responseContext。 映射中使用的键是 Thread 对象本身。 因此,由于您的应用程序在具有线程池的应用程序服务器上运行,并且 Web 服务调用是从不同线程进行的,因此永远不会从 ClientImpl.responseContext WeakHashMap 中删除最后一个响应,因为线程本身永远不会被垃圾收集。 而且由于您的响应很大,内存已满,看起来像是内存泄漏问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM