码头中Websocket会话的潜在内存泄漏(9.4.15)

时间:2019-04-24 11:57:15

标签: java spring-boot websocket jetty-9

我有一项服务,可以接受并来回创建多个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线程)和某些调度程序(请参见下面的图像集) enter image description here enter image description here enter image description here enter image description here 我的问题:

  1. 是否有人遇到过这样的码头行为,随着时间的流逝释放了websockets资源?
  2. 我看到一些调度程序线程也包含websocket会话。有谁知道这是否是码头内部?还是它们是由Spring Boot层贡献的?还是其他?
  3. Jetty是否可以在内部保留所有会话(甚至是已关闭的会话)并且仅定期释放它们? (或某种可以解释我如何使这8K封闭式会话活跃而又活跃的机制?)

1 个答案:

答案 0 :(得分:1)

是的,我遇到了类似的问题。升级到码头9.4.28之后,内存泄漏消失了。