0

私のJavaアプリケーションでは、開いているモデルを閉じると、一部のオブジェクトがガベージコレクションされません。Eclipse MATを使用してGCルートへのパスを検出し、モデルを閉じた後に参照がnullに設定されていることを確認して、GCがメモリをクリーンアップできるようにします。

以下の参照(Eclipse MAT出力からの抜粋)をクリアできません。

myTree javax.swing.JTree
    uiTreeExpansionListener、keyListener、focusListener javax.swing.plaf.basic.BasicTreeUI $ Handler
          PressedPath javax.swing.tree.TreePath
             lastPathComponent myClass

myTree(JTree)がリスナーの値をリセット/クリアしない場合、myClassのオブジェクトへの参照がlastPathComponentに保持され、ガベージコレクションません。

参照を維持しないようにツリーに指示する方法について何かアイデアはありますか?

編集:参照をクリアするために次のメソッドを配置しましたが、すべての(上記の)参照をクリアするわけではありません。

    public void clear(){
        cancelEditing();
        CollapseAll();
        明確な選択();
        clearToggledPaths();
        resetKeyboardActions();
        fireTreeCollapsed(null);
    }
4

1 に答える 1

0

私は、少なくとも私の問題を解決するための回避策(クリーンでエレガントな解決策ではない)を見つけました。次のコードは、すべての(既知の)参照を解放する役割を果たします。

public void clear(){
   cancelEditing();
   明確な選択();
   clearToggledPaths();
   resetKeyboardActions();
   updateUI();
}

モデルを閉じるときに上記のメソッドを実行する必要があるため、パフォーマンスはそれほど低下しない可能性があります。しかし、可能であれば、よりエレガントな(そして概念的に正しい)ソリューションをお勧めします。

于 2012-05-18T16:03:17.327 に答える