Tomcat逐渐耗尽内存,部署了WebSocket应用程序

Tom*_*mmo 17 java memory tomcat websocket eclipse-mat

我在一个AWS盒子上运行Tomcat 8.5.9,部署了10个不同的WebSocket应用程序,每个应用程序基本上都充当了消息代理.https连接器正在使用Http11NioProtocol.我设置的唯一参数是maxThreads = 200以及证书信息.

请求量不是很高.它从周一早上开始运行,这是经理状态所说的:

最大线程数:200
当前线程数:38
当前线程忙:0
保持活动套接字计数:1
最大处理时间:234 ms
处理时间:17.254 s
请求计数:33351
错误计数:325
字节收到:0.00 MB
字节发送:34.07 MB

几天后,我注意到内存使用量继续增长.我必须每两周左右重启一次Tomcat服务,以防止出现OutOfMemoryException.

我一直在使用Eclipse MAT进行堆转储和分析,它始终指向WsFrameServer类是可疑问题.最新的转储显示以下内容:

5,146个"org.apache.tomcat.websocket.server.WsFrameServer"实例,
由"java.net.URLClassLoader @ 0x6c0047c28"加载,占用1,383,143,200
(73.13%)个字节.这些实例是从
"java.util.concurrent.ConcurrentHashMap $ Node []"的一个实例引用的.

Dominator Tree目前有106,000个条目,其中大部分是WsFrameServer类.

我做错了什么还是这个"正常"?Tomcat或连接器上是否有任何特定设置我应该设置以防止这种情况发生?

提前致谢.

编辑:我不确定这是否有用,但这是VisualVM监视器的样子:

VisualVM监视器

Mag*_*nus 5

没有更多细节很难确定,但这可能与您的会话保留有关。我认为正在发生的是WsFrameServerwhich extendsWsFrameBase 被添加到会话中。
如果您有无限的会话保留策略,那么您最终会耗尽内存。

尝试设置一个非 0 sessionTimeout