2015-07-04 52 views
0

我知道我們不能保證在java中調用垃圾回收器。垃圾回收器沒有運行

public class finalizeDemo { 
    protected void finalize() { 
     System.out.println("Wow!! I am called"); 
    } 
} 

class testFinalizeDemo { 
    public static void main(String[] a) { 
     finalizeDemo obnj = new finalizeDemo(); 

     System.gc(); 
     /** 
     * Forcefully call garbage collector. 
     */ 
    } 
} 

但我看了System.gc()會強行調用gc。但是我的聲明沒有在當地的日食中打印。

有誰知道爲什麼沒有打印聲明?

+1

如果你明白你不能保證調用GC,你怎麼能相信System.gc()會強制調用gc?你爲什麼不讀它javadoc? http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc%28%29。你爲什麼認爲應該有什麼東西?調用gc()時仍然有對象的引用,所以它不能被GCed。 –

+0

@JBNizet感謝參考文檔。我沒有看到不能保證的線路。那是多麼困惑我。如果沒有保證,我不明白這種方法的總目的? –

+0

如果javadoc說方法*強制* JVM執行GC,那麼您將得到一個保證。但是javadoc並沒有這樣說。它表示該方法**建議** JVM執行GC。 –

回答

0

當您調用System.gc時,obnj引用的對象是活動對象。它仍然被obnj引用。所以垃圾收集器的正確行爲是不完成de對象。

嘗試調用System.gc()的前增加obnj = NULL

它仍然不能保證該對象將最終確定,但至少現在它是可能的。

0

的代碼將打印

哇!我叫

因爲有一個參考tor需要完成的對象。

class FinalizeDemo { 
    protected void finalize() 
    { 
     System.out.println("Wow!! I am called"); 
    } 
    } 

public class testFinalizeDemo 
    { 
    public static void main(String[] a) 
    { 
     FinalizeDemo obnj = new FinalizeDemo(); 
     obnj = null; 

     System.gc(); 
     /** 
     * Forcefully call garbage collector. 
     */ 
    } 
    }