2

JTabbedPane にいくつかのタブを追加しました。各タブには JPanel が含まれています。JTabbedPane.remove([タブ インデックス]) を呼び出してタブを削除します。これによりタブが削除され、アプリをプロファイリングするときに、JTabbedPane に追加された JPanel が「破棄」されず、参照がヒープにまだ存在することを除いて、すべて問題ありません。タブを追加して閉じるという 100 回の操作の後、アプリはメモリ不足になります。

Eclipse MATを使用してヒープ ダンプを分析し、タブを閉じた後にそこにあるはずのない JPanel の Immediate Dominators をクリックしました。Immediate Dominator が JTabbedPane として戻ってきました。

それで、問題を再現するために SSCCE を書きましたが、問題を再現できないことがわかりました。タブを閉じると、JPanel が破棄されます。私が欠けているものはありますか?場合によっては、タブを閉じた後でも JTabbedPane が JPanel への参照を保持するのはなぜですか?

アップデート:

MAT ヒストグラムをもう少し詳しく調べていたところ、おかしなことがわかりました。

これは、タブが開いているときのヒープ ダンプのスナップショットです。以下は、クラスの正しい階層です。HomeFrame には、ShareholderDtlsPanel を含む MasterDataDisplayPanel を含む JTabbedPane が含まれています。また、オブジェクト ShareholderDtlsPanel - ..a20 のハッシュコードに注意してください。

ここに画像の説明を入力

タブを閉じた後の状態を示す画像です。ShareholderDtlsPanel のハッシュコードは異なります..b340 であり、まったく関係のない PropertyChangeListener に関連付けられています。 ここに画像の説明を入力

誰かがここで何が起こっているのかを理解するのを手伝ってもらえますか? これはおそらくswingx JXTaskPaneContainerのバグですか?

4

0 に答える 0