我知道System.gc()
不能保證導致GC,但理論上,在下面的代碼中,對象obj
是否有資格進行垃圾回收?對象是否符合「obj = null」之後垃圾回收的條件?
public class Demo {
public static void main(String[] args) throws Exception {
SomeClass obj = new SomeClass();
ArrayList list = new ArrayList();
list.add(obj);
obj = null;
System.gc();
}
}
class SomeClass {
protected void finalize() {
System.out.println("Called");
}
}
也不能保證'finalize'永遠不會被調用 – MadProgrammer 2013-03-19 06:15:09
不符合條件,因爲您的obj引用爲空,但在存在的列表中仍然可以訪問。 – 2013-03-19 06:17:08
雖然答案是「否」(假設變量始終是強根),但這是一個有趣的觀點。在.NET/C#中,SomeClass對象*可能*被垃圾回收,因爲'list'本身並未被使用[稍後]。這是一個長時間運行的方法中帶有定時器回調的實際.NET問題。問題是:*在Java *中,*可見堆棧中的每個*變量*總是*保證是一個強壯的根? – 2013-03-19 06:52:56