【问题标题】:Apache CXF Client MemoryApache CXF 客户端内存
【发布时间】:2017-06-13 15:04:41
【问题描述】:

我们的 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()
    }
}

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: java apache web-services cxf


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多