我有一项服务,可以接受并来回创建多个websocket会话(它们已关闭,然后重新打开,等等)。为了关闭websocket会话,我将close
方法称为spring的 webSocketSession 对象,我猜这是与码头本身的 WebSocketSession 对象绑定的。
我的服务在带有嵌入式Jetty服务器(9.4.15)的Spring Boot(1.5.20)上运行,并且正在使用具有默认参数的G1 GC(也许稍后会进行微调)
最近,该服务似乎有一些内存泄漏,我正在尝试调查。 从应用程序POV验证我身边没有打开的会话之后,并手动“强制” GC(使用JConsole)之后,我进行了堆转储。
堆转储是使用带有 live = true 参数的JConsole进行的,因此,我非常确定在GC对它进行了所有可用的清理后,我会有一个转储。
我使用Eclipse MAT分析了转储,发现我有〜8K WebSocketSession 对象保持活动状态。该指标与某种适用性指标成比例,我已经证明我的服务到目前为止已经处理了约8000个连接(在我将Jetty用作WS客户端的情况下,传入WS连接为8K,传出WS连接为8K)。
我分析了这些对象之一到GC根的路径,发现其中一些路径包括Jetty线程(qtp-XXX线程)和某些调度程序(请参见下面的图像集) 我的问题:
答案 0 :(得分:1)
是的,我遇到了类似的问题。升级到码头9.4.28之后,内存泄漏消失了。