考慮這個示例代碼:當一個對象符合垃圾收集器的條件嗎?
1. public class GC {
2. private Object o;
3. private void doSomethingElse(Object obj) { o = obj; }
4. public void doSomething() {
5. Object o = new Object();
6. doSomethingElse(o);
7. o = new Object();
8. doSomethingElse(null);
9. o = null;
10. }
11. }
當DoSomething的方法被調用,之後行不符合 5中創建的對象成爲可用於垃圾回收?
A.線5
B.線6
C.線7
D.線8
E.線9
F.第10行
答案:D
爲什麼D?確實,當執行第6行時,第5行中創建的對象現在由實例var o和本地var o引用,並且當執行第8行時,對象現在僅由本地ref var o引用,爲什麼答案是D,執行第9行後會發生什麼?謝謝。
智能JIT可以完全消除第9行。 –
這真的取決於你正在使用的gc算法。我會說部分gc應該在第8行方法調用之後清理它,以便在eden空間中進行掃描。 – CoolBeans
@CoolBeans該算法會告訴你它何時實際得到GC'd;資格由JLS決定。 – corsiKa