2013-12-11 44 views
5

我已閱讀該對象在下列情況下有資格進行垃圾回收。是否有可能確定該對象是由垃圾收集器收集還是不在java中?

  1. 該對象的所有引用顯式設置爲null。
  2. 對象在塊內部創建並且引用超出範圍 一旦控制權退出該塊。
  3. 父對象設置爲null,如果一個對象持有另一 對象的引用,當你設置的容器對象的引用空,子女或 包含的對象自動成爲符合垃圾收集 。

但是有無論如何確定有資格進行垃圾回收的對象是垃圾回收器收集的嗎?

+1

爲什麼你需要知道這一點?任何具體原因? – kosa

+2

只要您直接或間接地引用對象,它就不會獲得垃圾回收的資格。所以,當它最終被垃圾收集時,你不再有任何的參考,這意味着你無法識別它 - 你必須完全忘記它,否則它不會被垃圾收集。 –

+0

@Nambari .. 我正在閱讀關於垃圾收集器工作的文章,這個問題出現在我的腦海裏。 沒有其他原因。 – Dhruv

回答

2

您可以實現Object#finalize()方法

public class Driver { 
    public static void main(String[] args) throws Exception { 
     garbage(); 

     System.gc(); 
     Thread.sleep(1000); 
    } 

    public static void garbage() { 
     Driver collectMe = new Driver(); 
    } 

    @Override 
    protected void finalize() { 
     System.out.println(Thread.currentThread().getName() + ": See ya, nerds!"); 
    } 
} 

它打印

Finalizer: See ya, nerds! 

所以,你可以收集前右攔截。的Javadoc狀態

最終化的常規協定是,它是如果調用以及當 的JavaTM虛擬機已經確定不再有任何 手段,使該目的可以通過具有不屬於任何線程訪問 還沒有死亡,除了由於準備完成的其他某個對象或類的定稿 所採取的行動。 finalize方法可以採取任何行動,包括使這個對象 再次可用於其他線程;

而且

finalize方法是從不爲任何給定對象多次調用由Java虛擬機 。

2

之後對象被垃圾收集後,JVM調用其方法finalize。默認實現什麼也不做;您可以覆蓋它,例如,打印告別信息,或者關閉一些打開的資源。

但請注意,不能保證收集後多久被調用。

+2

你的第一句話是錯的。 'finalize()'將在對象被認爲是可收集的時候被調用,而不是在它被收集之後調用。 –

+0

@Sotirios Delimanolis是你的措辭更準確 –