Tomcat は WebSocket アプリを展開するとメモリが徐々に不足する 質問する

Tomcat は WebSocket アプリを展開するとメモリが徐々に不足する 質問する

私は 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

数日後、メモリ使用量が増加し続けていることに気付きました。OutOfMemoryException が発生しないようにするには、約 2 週間ごとに Tomcat サービスを再起動する必要があります。

私はヒープ ダンプを取得し、Eclipse MAT を使用して分析してきましたが、常に WsFrameServer クラスが問題の原因であると指摘されています。最新のダンプには次のように表示されます。

「java.net.URLClassLoader @ 0x6c0047c28」によってロードされた「org.apache.tomcat.websocket.server.WsFrameServer」の 5,146 個のインスタンスは、
1,383,143,200 (73.13%) バイトを占めます。これらのインスタンスは、 「java.util.concurrent.ConcurrentHashMap$Node[]」
の 1 つのインスタンスから参照されます。

ドミネーター ツリーには現在 106,000 個のエントリがあり、そのほとんどは WsFrameServer クラスです。

何か間違ったことをしているのでしょうか、それともこれは「正常」なのでしょうか? このような事態を防ぐために Tomcat またはコネクタで設定する必要がある特定の設定はありますか?

前もって感謝します。

編集: 役に立つかどうかはわかりませんが、VisualVM モニターは次のようになります。

VisualVM モニター

ベストアンサー1

詳細がわからないと断言はできませんが、これはおそらくセッション保持に関連していると思われます。私が思うにWsFrameServerWsFrameBase セッションに追加されます。
無制限のセッション保持ポリシーがある場合、最終的にはメモリが不足することになります。

0以外の値を設定してみてくださいsessionTimeout

おすすめ記事