2009-11-02 209 views
0

我在接受採訪時遇到這樣一個問題:方法和垃圾收集

裏面創建一個方法 符合垃圾收集 的對象的方法完成後?

是的正確答案?

+2

答案取決於比你的問題中陳述的更多的東西。面試官可能正在等待你詢問相關問題 - 他們想知道你對垃圾收集有多少了解,這可以根據你問他們的回答來確定。 – 2009-11-02 21:23:53

+0

是的,只要它沒有被「根路徑」引用,即它沒有被另一個不可終結的對象引用。 – rsp 2009-11-02 21:38:06

回答

3

嗯,這取決於 - 只要沒有更多的「實時」引用,就有資格進行垃圾回收。如果你在方法中做了某些事情,這意味着方法結束後仍然有活動引用,那麼不行 - 該對象將不符合垃圾回收的條件。例如:

public class Test 
{ 
    private Object field; 

    public void foo() 
    { 
     field = new Object(); 
    } 

    public Object getField() 
    { 
     return field: 
    } 
} 

// Elsewhere 
Test t = new Test(); 
t.foo(); 
Object x = t.getField(); 

foo()創建的對象肯定是符合垃圾收集時foo()已經完成 - 畢竟,我們希望它的下一行代碼獲取!

1

假設對該對象的引用沒有交給其他方法,當方法退出時仍然在範圍內,那麼是的。

9

當沒有對象的引用或者引用它的每個對象也被垃圾收集時,對象可以被垃圾收集。

public int getThing() { 
    Object o = new Object(); 
    return 5; 
} 

這裏,Ø可以是方法後收集垃圾,因爲沒有指向它。

Object o = null; 

public int getThing() { 
    o = new Object(); 
    return 5; 
} 

這不能,因爲其他的事情還是可以參考Ø因爲它是一個類成員。

public Object getThing() { 
    Object o = new Object(); 
    return o; 
} 

這裏不能,因爲它被返回。如果呼叫者堅持,它仍然活着。

如果有人有指向它的指針,它會保持活動狀態(大致)。

1

我想添加到上面的答案唯一的事情是,只要有一個從一個不符合條件的對象內引用它,對象不符合垃圾回收的條件。

有一些弱引用(和其他一些類型的東西)使對象指向可收集對象,即使引用本身仍然存在。你可以看到WeakHashMap和相關的更多信息。