Tomcat にデプロイされた GWT ベースのアプリケーションがあります。1 日おきに、アプリケーションが OutOfMemoryException でクラッシュします。そのため、割り当てられた最大メモリの使用に近づいたときに、アプリケーションのヒープ ダンプを取得し始めました。
アプリケーションの動作は次のとおりです。
- ユーザーがアプリケーションにログインします
- クラスター設定を使用してサーバー上で分析されるアプリケーションへの入力を入力します。
- クライアントは、ジョブのステータスについて 15 秒ごとにサーバーをポーリングし、UI コントロールを更新します。ポーリングは、サーバーからデータを取得する requestfactory 呼び出しを使用して行われます。
- ジョブが完了したら、フレックステーブルを使用してユーザーに結果を表示します。6 列で約 1000 行になる場合があります。
ヒープダンプ、
jmap を使用して tomcat プロセスのヒープ ダンプを取得し、何がメモリに保持されているかを確認しました。次の写真は、ヒープ ダンプを使用して Eclipse Memory Analyzer を使用して撮影したものです。
保持サイズが 25k のヒープに多数のハッシュマップ エントリが保持されており、それらのエントリが約 600 万個あることがわかります。
質問:
- com.google.gwt.core.client.impl.WeakMapping は 16 バイトの浅いヒープを示していますが、保持されたヒープは、アプリケーションに割り当てたメモリのほとんどすべてです。
- 15 秒ごとにサーバーをポーリングし、何らかの形で参照されているが GC されていないデータを取得しているためでしょうか。
- これらのハッシュマップの参照を解除するにはどうすればよいですか。
- ここで述べたシナリオとはまったく違うものですか。
これまで、アプリケーションの分析には jconsole、jprofiler、MAT、jhat を使用してきました。そして、問題がどこにあるのかわかりません。
あなたの助けに感謝。