我有一个服务,可以接受并来回创建几个 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线程)和一些调度器所持有,其中包括(见下面一组图片)。我的问题是:有没有人遇到过这样的行为?
是的,我也遇到过类似的问题。升级到jetty 9.4.28后,内存泄漏的问题已经消失了。