首页 > 解决方案 > Grizzly 2.4.4 关闭的 WebSockets 内存泄漏

问题描述

我被要求分析导致环境内存不足的堆转储。该项目正在使用 grizzly 2.4.4 websockets 模块。

问题是在高负载下(websocket 连接) - 当连接被频繁地创建和关闭时 - 旧的关闭连接不会被垃圾收集并导致内存泄漏。

在堆转储中,我注意到所有这些关闭的 websocket 的模式相同——它们通过它的 protocolHandler->filterChainContext->TcpNIOConnection 索引属性被实时(连接的)websocket(从 GC 根开始)以某种方式引用。

这看起来像链接:
connected_websocket ->protocolHandler->filterChainContext->tcpNioConnection->attributes->websocketHolder-> old_closed_websocket ->....

查看代码我不明白这实际上是如何实现的 - TcpNIOConnection 实例不应该是独立的而不是相互引用吗?

这是堆转储的屏幕截图,更具说明性: 在此处输入图像描述

注意底部的 EmsWebSocket(它扩展了 DefaultWebSocket - 没什么特别的)。这是连接的 websocket。它指的是连续关闭的多个 websocket 持有者和 TcpNIOConnections。这怎么可能重现呢?我在本地尝试但没有成功。

如果某个灰熊开发人员可以对此发表评论,那就太好了。

提前致谢,

标签: websocketmemory-leaksgrizzly

解决方案


推荐阅读