我的问题是:什么时候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何时“可能”完成?
答案 0 :(得分:2)
当没有对它的引用并且任何活动线程没有访问它时,该对象有资格进行垃圾回收。何时进行垃圾收集取决于JVM
答案 1 :(得分:1)
实际上,垃圾收集将删除任何无法从堆栈中访问的对象(=所有线程中的所有活动函数调用)。
当你致电start()
时,你正在创建一个新线程,java将为你调用run()
。在创建此线程时,对Test
对象的引用将复制到新线程的堆栈中。通过调用你的run()
是新线程的堆栈。
完成run()
功能后,线程将被删除。并且将不再引用Test
对象,并且可以清除它。 (在java中,你通常会谈到eligible for cleanup
,所以你说:它可能会被清理,但是一如既往,垃圾收集会决定它是否/何时发生。
答案 2 :(得分:0)
实际上,当任何活动线程无法访问对象时,垃圾收集器会拾取对象。因此,在您的案例中,只要线程退出main方法,您创建的对象就会用于GC。
答案 3 :(得分:0)