[英]Anonymous object and Garbage Collection in Java
我的問題是:什么時候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何時“可能”完成?
當沒有對它的引用並且任何活動線程沒有訪問它時,該對象有資格進行垃圾收集。 何時進行垃圾收集取決於JVM
實際上,垃圾收集將刪除任何無法從堆棧中訪問的對象(=所有線程中的所有活動函數調用)。
當你調用start()
你正在創建一個新線程,java將為你調用run()
。 在創建此線程時,對Test
對象的引用將復制到新線程的堆棧中。 通過調用run()
是在新線程的堆棧上。
完成run()
函數后,線程將被刪除。 並且將不再引用Test
對象,並且可以清除它。 (在java中,你通常會說有eligible for cleanup
,所以你說:它可能會被清理,但一如既往垃圾收集決定它是否/何時真正發生。
實際上垃圾收集器會在任何活動線程無法訪問它們時拾取對象。 因此,在您的案例中,只要線程退出main方法,您創建的對象就會用於GC。
Imho答案仍然是:不能說。 但是,在這種情況下,只有在線程完成其工作后才能通過GC刪除。 實際的“最終確定”時間取決於更多因素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.