2012-07-02 28 views
1

回來後我有一個關於Java中如何GC的作品的問題。 考慮下面的代碼:GC收集引用的對象從範圍

class C1 { 
    ArrayList<int> myList = new ArrayList<int>(); 

    public void setList(ArrayList<int> l) { 
     myList = l; 
    } 
} 

func(C1 C) { 
    ArrayList<int> l1 = new ArrayList<int>(); 
    l1.add(1); 
    C.setList(l1); 
} 

main() { 
    C1 C = new C1(); 
    func(C); 
    ... 
} 

我的問題是: 做後func()回報或沒有GC版本 'L1'?

+0

是你的問題後大約'主()'末端,或者是你設想在其他活動'主()'是嚴格無關'C'? –

+0

沒有,考慮'其他活動的main()'無關C. – MBZ

+0

作爲參考,ArrayList的''是不是編譯的事情。 '雖然ArrayList '可能。 –

回答

5

不,它沒有,因爲有一個有很強參考(myList)的根引用(堆棧變量C),到新的ArrayList。後main()返回,則C1ArrayList是收藏,因爲根參考消失。

2

居然還有就是HotSpot的JIT做的優化,這是檢測在哪個局部變量將不再被訪問的點在那一刻將其清除。所以你的問題的完整答案是「可能,但沒有保證」。最近我玩了一些代碼並測量了一個大陣列的內存。直到我實際上是在該方法的TE端插入array.hashCode(),我觀察到它被更早釋放。