Java中的匿名对象和垃圾收集

时间:2014-04-27 13:47:13

标签: java garbage-collection

我的问题是:什么时候Java中的垃圾收集器扫描了一个匿名对象?

代码是:

class Test extends Thread
{
    Test(){}
    public void run()
    {
        for(int i=0;i<4;i++)
            System.out.println(this.getName()+"i="+i);
    }
    protected void finalize()
    {
        System.out.println("Finalized");
    }
    public static void main(String args[])
    {
        new Test().start();
    }
}

根据我对Java的了解,任何未引用的对象都会被GC扫描。但这里没有对象参考。 虽然无法预先确定垃圾收集过程,但是,GC何时“可能”完成?

4 个答案:

答案 0 :(得分:2)

当没有对它的引用并且任何活动线程没有访问它时,该对象有资格进行垃圾回收。何时进行垃圾收集取决于JVM

答案 1 :(得分:1)

实际上,垃圾收集将删除任何无法从堆栈中访问的对象(=所有线程中的所有活动函数调用)。

当你致电start()时,你正在创建一个新线程,java将为你调用run()。在创建此线程时,对Test对象的引用将复制到新线程的堆栈中。通过调用你的run()是新线程的堆栈。

完成run()功能后,线程将被删除。并且将不再引用Test对象,并且可以清除它。 (在java中,你通常会谈到eligible for cleanup,所以你说:它可能会被清理,但是一如既往,垃圾收集会决定它是否/何时发生。

答案 2 :(得分:0)

实际上,当任何活动线程无法访问对象时,垃圾收集器会拾取对象。因此,在您的案例中,只要线程退出main方法,您创建的对象就会用于GC。

答案 3 :(得分:0)

Imho答案仍然是:不能说。但是,在这种情况下,只有在线程完成其工作后才能通过GC删除。实际的&#34;定稿&#34;时间取决于更多因素。