2014-09-29 44 views
0

我有一些關於Java垃圾收集的問題。這段代碼可以垃圾收集嗎?

下面是一些測試類

public class ChildMaker{ 
    public Child createChild(){ 
     Child c = new Child(); 
     return c; 
    } 
} 

的代碼和實際測試,我執行

public class TestChildMaker{ 
    public getChild(){ 
     ChildMaker maker = new ChildMaker(); 
     Child c = maker.createChild(); 
     .... 
    }   
} 

我不知道ChildMaker實例可以被垃圾收集。它可以 ?

+0

該類還是該對象? – 2014-09-29 00:32:24

+0

@SotiriosDelimanolis:我編輯它認爲垃圾收集班是沒有意義的。 – Dici 2014-09-29 00:36:17

+1

@Dici(好吧,它的確很少見) – 2014-09-29 00:37:12

回答

2

Java垃圾回收器非常複雜,並且喜歡相當自主地工作。你不能強制垃圾收集任何東西,你只能指出它什麼時候可能想要垃圾收集。

引用仍然保留在程序中的任何對象(嚴格來說:仍然可以運行的任何線程)不能被垃圾收集。別的可能是。

我想你問的是ChildMaker實例可以被垃圾收集,而Child仍然被引用。嚴格地說,你提供的代碼中不存在這樣的位置。答案是肯定的。如果ChildMaker未被引用,那麼即使Child仍被引用,它也可以被垃圾收集,因爲Child不包含對ChildMaker的引用。

1

答案取決於如果變量maker被重複使用會發生什麼

public getChild(){ 
    ChildMaker maker = new ChildMaker(); 
    Child c = maker.createChild(); 
    .... // here <-------- 
}  

,它引用的對象是可到達的,因此不能被垃圾收集。如果maker未被重用,則該對象不再可用,因此可以進行垃圾收集。

Java Language Specification狀態

可達的對象是可以在任何潛在的 繼續計算從任何活動線程訪問的任何對象。