我在一个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类作为问题嫌疑对象。最近的dump显示如下:
"org.apache.tomcat.websocket.server.WsFrameServer"的5,146个实例,
被"java.net.URLClassLoader @ 0x6c0047c28"加载,占用了1,383,143,200
(73.13%)字节。这些实例是从一个“java.util.concurrent.ConcurrentHashMap $ Node []”的实例引用的。
Dominator Tree当前有106,000个条目,其中大多数是WsFrameServer类。
我做错了什么还是这个情况“正常”?是否应该在Tomcat或Connector上设置特定的设置以防止此情况发生?
提前致谢。
编辑:我不确定这是否有帮助,但这是VisualVM监视器的样子:
ConcurrentHashMap
的引用的类。 - Tommo