2011-12-13 75 views
0

是否有任何垃圾收集對象的方法?據我所知finalize()之前被調用,如果任何對象將被垃圾收集。在Java中垃圾收集對象的方法

+3

一般來說,這不是你應該試圖做的事情,除非在極少數情況下,通常有更好的方法來解決問題。 –

回答

3

有一種方法System.gc();它只是給提示垃圾收集器垃圾對象。但是,不,沒有任何方法可以調用,並立即收集垃圾。

6

禮貌地作爲垃圾收集器刪除對象的唯一方法是刪除可用於訪問它的所有引用。

Object o = new Object(); 
o = null; // at this point GC may remove the object. 

要強制該過程,您可以嘗試撥打System.gc()。但請記住,它不能保證在此迭代GC時真正刪除對象。

+3

+1它不能保證你的對象在這個迭代的GC中真的被刪除。 – Kent

+1

它也不保證在System.gc()被調用時實際運行垃圾回收。 – Bombe

4

是否有任何垃圾收集對象的方法?

沒有沒有。

對象將(可能)在變得「無法訪問」後被垃圾收集。通過調用System.gc()可能導致垃圾收集器在特定時間運行。然而。允許JVM忽略您的System.gc()調用,並且在錯誤的時間運行GC會浪費資源。

事實上,呼籲System.gc()收回單個對象是可怕效率低,而且不一定會收回它無論如何,即使這是在這一點上的垃圾。


這是一個錯誤的Java應用程序依賴的對象是在特定時間收集垃圾,或在特定的時間中運行終結。如果您的應用程序設計爲以這種方式工作,則應重新設計它。

+0

嗨斯蒂芬,其實這個問題在一次採訪中問我,當時我忘了System.gc(),我告訴他沒有方法來垃圾對象。不管怎麼說謝謝 – saloni

+0

好,你說得對,那麼。 – Bombe

1

您可以檢查this reply它展示瞭如何確保GC對從jlibs使用RuntimeUtil.gc()堆的一些片段至少運行:

/** 
    * This method guarantees that garbage collection is 
    * done unlike <code>{@link System#gc()}</code> 
    */ 
    public static void gc() { 
    Object obj = new Object(); 
    WeakReference ref = new WeakReference<Object>(obj); 
    obj = null; 
    while(ref.get() != null) { 
     System.gc(); 
    } 
    } 

您可以使用類似的技術來取代obj引用你想要的對象gc。

注意:如果GC從不運行並收集新分配的對象,該方法將陷入無限循環。

2

你不應該依靠System.gc();與圖像。

以下示例將收集對象垃圾回收。

bitmap.recycle(); 
bitmap = null;` 

注:System.gc();明顯減慢了應用上的一些設備。