在我的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)未重置/清除侦听器中的值,则会在 lastPathComponent 中为 myClass <的对象维护一个引用/ strong>并且它不是垃圾收集。
有关如何告诉树不维护引用的任何想法吗?
编辑:我已经使用以下方法来清除引用,但它并没有清除所有(上面提到的)引用。
public void clear() { cancelEditing(); collapseAll(); clearSelection(); clearToggledPaths(); resetKeyboardActions(); fireTreeCollapsed(null); }
答案 0 :(得分:0)
我找到了一个解决方法(不是一个干净而优雅的解决方案),至少可以解决我的问题。以下代码完成了释放所有(已知)引用的工作。
public void clear() { cancelEditing(); clearSelection(); clearToggledPaths(); resetKeyboardActions(); updateUI(); }
由于我需要在关闭模型时执行上述方法,因此性能可能不会太大。但如果可能的话,我宁愿选择更优雅(也是概念上正确的)解决方案。