我让Tomcat8.5.9运行在一个亚马逊网络服务机器上,上面部署了10个不同的WebSocket应用程序,每个应用程序基本上都充当消息代理。https连接器正在使用Http11NioProtocol。我设置的唯一参数是maxThreads=200和证书信息。
请求量不是很大。它从周一早上开始运行,经理状态是这样显示的:
最大线程数: 200
当前线程数: 38
当前线程正忙:0
保持活动套接字计数:1
最大处理时间:234ms
处理时间: 17.254秒
请求数: 33351
错误计数: 325
接收的字节数: 0.00 MB
发送字节数: 34.07 MB
几天后,我注意到内存使用量继续增长。我必须大约每两周重启一次Tomcat服务,以防止出现OutOfMemoryException。
我一直在使用Eclipse MAT进行堆转储和分析,它总是指出WsFrameServer类是问题的可疑之处。最新的转储显示以下内容:
"org.apache.tomcat.websocket.server.WsFrameServer",的
5,146个实例
由"java.net.URLClassLoader @ 0x6c0047c28“加载占用1383,143,200
(73.13%)字节。这些实例是从
"java.util.concurrent.ConcurrentHashMap$Node[]“
Dominator树目前有106,000个条目,其中大部分是WsFrameServer类。
是我做错了什么,还是这是“正常”的?在Tomcat或Connector上是否有我应该设置的特定设置,以防止这种情况发生?
提前谢谢。
编辑:我不确定这是否有帮助,但这是VisualVM监视器的样子:
发布于 2017-07-31 14:18:15
如果没有更多细节,很难确定,但这可能与您的会话保留有关。我认为正在发生的事情是扩展WsFrameBase
is added into the session.的WsFrameServer
如果您有一个无限制的会话保留策略,那么您最终将耗尽内存。
尝试设置非0 sessionTimeout
发布于 2017-08-04 20:19:28
您的问题中缺少代码。(特别是如何管理websocket连接)
你有没有在异步模式下使用tomcat和某个地方的连接列表?
您没有忘记将close和error事件绑定到从列表中删除错误连接的代码吗?
发布于 2017-08-05 09:57:49
众所周知,Java GC是懒惰的。它的内存将继续增长,直到它不能再有更多的内存,然后GC将被触发来收集垃圾。
从你的VisualVM截图中,我们可以看到内存使用是相对正常的:随着时间的推移,内存使用量增加,GC后内存使用量下降。
所以我想知道你的应用是否真的会因为OOM而崩溃。您可以在您的测试环境中尝试它,并让OOM JVM转储进行分析,这更有用。
顺便说一下,我建议使用VisualVM而不是MAT,因为MAT将包含一些unreachable对象作为GC根。它将使内存分析非常低效,并给出与我在我们的一个项目中遇到的其他工具不同的结果。
https://stackoverflow.com/questions/45242357
复制相似问题