jetty(9.4.15)中websocket会话的潜在内存泄漏。

问题描述 投票:1回答:1

我有一个服务,可以接受并来回创建几个 websocket 会话(它们被关闭,然后重新打开等)。为了关闭websocket会话,我调用了 "服务"。close 办法 webSocketSession 泉的对象,我想,它是和码头自己的内部联系在一起的 WebSocketSession 对象。

我的服务使用spring boot(1.5.20)和嵌入式jetty服务器(9.4.15)运行,使用G1 GC的默认参数(也许以后会有微调)

最近,这个服务似乎有一些内存泄漏,我正试图调查。我已经从应用程序POV验证了我这边没有打开的会话,并手动 "强制 "GC(使用JConsole)后,提取了一个堆转储。

该堆转储是在使用JConsole和 live=true 参数,所以我很确定我的转储是在GC对它进行了所有可用的清理之后。

我用Eclipse MAT分析了这个dump,发现我有~8K的WebSocketSession 的对象。这个度量与我的一个应用度量成正比,显示我的服务到目前为止处理了大约8K个连接(8K个传入的WS连接和8K个传出的WS连接,其中我使用jetty作为WS客户端)。

我分析了通往其中一个对象的GC根的路径,发现它被一些Jetty线程(qtp-XXX线程)和一些调度器所持有,其中包括(见下面一组图片)。enter image description hereenter image description hereenter image description hereenter image description here我的问题是:有没有人遇到过这样的行为?

  1. 有没有人遇到过这样的行为 jetty随着时间的推移释放websocket资源的问题?
  2. 我看到一些调度线程也持有websocket会话。有谁知道这些是jetty内部的,还是来自spring boot层的,还是其他什么?
  3. 会不会是Jetty在内部保存所有会话(甚至是那些被关闭的),并且只定期释放它们?(或者某种机制可以解释为什么我有这8K个所谓关闭的会话是活的和活跃的?)
java spring-boot websocket jetty-9
1个回答
1
投票

是的,我也遇到过类似的问题。升级到jetty 9.4.28后,内存泄漏的问题已经消失了。

© www.soinside.com 2019 - 2024. All rights reserved.