マルチタブ アプローチを使用する 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
(添付の画像を参照)。
閉じたウィンドウを破棄してメモリ リークを防ぐにはどうすればよいですか?
更新
コード ウィンドウは Vaadin にのみ追加され、削除されないことがわかりましたApplication
。追加した後、Application.removeWindow()
同じタブの更新に関連する変更はありません。