簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM