【问题标题】:Does reassigning the object reference variable kill the old object?重新分配对象引用变量会杀死旧对象吗?
【发布时间】:2016-06-28 18:11:47
【问题描述】:

如果我有一个扩展 JFrame 的类CatFrame,那么我设置myCat = new CatFrame();,然后再设置myCat = new CatFrame(false);。旧的 CatFrame 是否有资格进行垃圾回收?

public class CatFrame extends JFrame{
    public CatFrame(){
         this.setVisible(false);
    }

public CatFrame(boolean b){
         this.setVisible(false);
    }
}

【问题讨论】:

标签: java swing garbage-collection


【解决方案1】:

您需要小心扩展 Window 的 Swing 组件,例如 JFrame 和 JDialog,因为它们具有不会被垃圾回收的对等组件。要正确地 gc 窗口,请使用 Window.dispose();

否则,一旦堆上的对象无法从任何活动线程访问,该对象就有资格进行垃圾回收

【讨论】:

    【解决方案2】:

    是的。您正在用“新”CatFrame 替换“旧”CatFrame,从而允许垃圾收集器收集“旧”CatFrame,因为您的程序不再以任何方式访问它(如果这是唯一的参考)。

    编辑:

    JFrames 和其他类似的对象虽然有点棘手。请参阅 ControlAltDel 的答案。

    【讨论】:

    • 除非在重新分配之前保留了对旧对象的引用。
    • 或者那个对象是一个已经显示的窗口。参见 Window.dispose()
    • 错了,frames需要被dispose,UI stack可以保留一些对象,尤其是frames。
    猜你喜欢
    • 2017-06-08
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多