1

マルチタブ アプローチを使用する Vaadin アプリケーションがあります。が見つからないApplication.getWindow(String name)場合は、新しいウィンドウを作成してアプリケーションに追加するという方法でオーバーライドされます。super.getWindow(name)すべてのウィンドウにはWindow.CloseListener、出力する印刷メッセージがあります。また、ウィンドウの作成と破棄の瞬間も見られます-コンストラクターとfinalize()両方がメッセージをコンソールに出力します。

同じブラウザー タブを更新すると、新しいウィンドウが作成され、コンソールに のメッセージが表示され、メソッドWindow.CloseListenerからのメッセージは表示されません。finalize()インスタンスをカウントするシングルトン AtomicLong を追加すると (コンストラクターに追加、 dec in finalize())、時間とともに減少しないインスタンスの数が (これらの更新で) 増加していることがわかります。

どうやら Vaadin は閉じたウィンドウを格納しているようです。またjmap、アプリケーションを作成し、Eclipse MAT でヒープ ファイルを開きました。MAT は、閉じたウィンドウのコンポーネントの 1 つ がUriFragmentUtilityチェーンで参照されていることを示しています: Application-> WebApplicationContext-> CommuncationManager-> (paintableMap を介して) UriFragmentUtility(添付の画像を参照)。

閉じたウィンドウを破棄してメモリ リークを防ぐにはどうすればよいですか?

<code>UriFragmentUtility</code> から GC ルートへのパスの Eclipse MAT スクリーンショット、<code>DofApplication</code> は <code>com.vaadin.Application</code> のインスタンスです

更新 コード ウィンドウは Vaadin にのみ追加され、削除されないことがわかりましたApplication。追加した後、Application.removeWindow()同じタブの更新に関連する変更はありません。

4

0 に答える 0