我在 AWS 机器上运行 Tomcat 8.5.9,部署了 10 个不同的 WebSocket 应用程序,每个应用程序基本上都充当消息代理。https 连接器使用的是 Http11NioProtocol。我设置的唯一参数是 maxThreads=200 以及证书信息。
请求量不是很高。它从周一早上开始运行,经理状态如下:
最大线程数:200
当前线程数:38
当前线程忙:0
保持活动套接字数:1最长
处理时间:234 毫秒
处理时间:17.254 秒
请求数:33351
错误数:325
接收字节:0.00 MB
发送字节:34.07 MB
几天后,我注意到内存使用量继续增长。我必须大约每两周左右重新启动一次 Tomcat 服务,以防止出现 OutOfMemoryException。
我一直在使用 Eclipse MAT 进行堆转储和分析,它总是将 WsFrameServer 类作为问题嫌疑人。最近的转储显示以下内容:
由“java.net.URLClassLoader @ 0x6c0047c28”加载的“org.apache.tomcat.websocket.server.WsFrameServer”的5146个实例
占用了1383143200
(73.13%)字节。这些实例引用自
“java.util.concurrent.ConcurrentHashMap$Node[]”的一个实例
Dominator Tree 目前有 106,000 个条目,其中大部分是 WsFrameServer 类。
我做错了什么还是这是“正常的”?在 Tomcat 或连接器上是否有任何特定设置我应该设置以防止这种情况发生?
提前致谢。
编辑:我不确定这是否有帮助,但这是 VisualVM 监视器的样子: