※ 引述《PsMonkey.bbs@ptt.cc (痞子軍團團長)》之銘言:
: 程式段3:
: 1. Object aobj = new Object ();
: 2. Object bobj = new Object ();
: 3. Object cobj = new Object ();
: 4. aobj = bobj;
: 5. aobj = cobj;
: 6. cobj = null;
: 7. aobj = null;
: 問:這段代碼中,第幾行的記憶體空間符合垃圾收集器的收集標準?
: 答:第 7 行。注意這類題型是認證考試中可能遇到的最難題型了。
: 行 1~3 分別創建了 Object 類的三個對象:aobj,bobj,cobj
: 行 4:此時對象 aobj 的句柄指向 bobj,所以該行的執行不能使 aobj 符
: 合垃圾收集器的收集標準。
錯的, 此時aobj原來的instance已經沒人存取得到了, 所以會被gc掉
經程式驗證過, 如下: (為方便大家複製貼上, 刻意壓縮行數, 排版較難看些)
public class T {
String name;
public T(String n) { name = n; }
protected void finalize() { System.out.println (name + " was GCed."); }
public static void main(String args[]) {
T a = new T("a");
System.out.println ("line 1: "); System.gc();
T b = new T("b");
System.out.println ("line 2: "); System.gc();
T c = new T("c");
System.out.println ("line 3: "); System.gc();
a = b;
System.out.println ("line 4: "); System.gc();
a = c;
System.out.println ("line 5: "); System.gc();
c = null;
System.out.println ("line 6: "); System.gc();
a = null;
System.out.println ("line 7: "); System.gc();
}
}
執行結果:
line 1:
line 2:
line 3:
line 4:
a was GCed.
line 5:
line 6:
line 7:
c was GCed.
: 行 5:此時對象 aobj 的句柄指向 cobj,所以該行的執行不能使 aobj 符
: 合垃圾收集器的收集標準。
: 行 6:此時仍沒有任何一個對象符合垃圾收集器的收集標準。
: 行 7:對象 cobj 符合了垃圾收集器的收集標準,因為 cobj 的句柄指向單
: 一的地址空間。在第 6 行的時候,cobj 已經被賦值為 null,但由 cobj 同時
: 還指向了 aobj(第 5 行),所以此時 cobj 並不符合垃圾收集器的收集標準。
: 而在第 7 行,aobj 所指向的地址空間也被賦予了空值 null,這就說明瞭,由
: cobj 所指向的地址空間已經被完全地賦予了空值。所以此時 cobj 最終符合了
: 垃圾收集器的收集標準。但對於 aobj 和 bobj,仍然無法判斷其是否符合收集
: 標準。
--
※Post by leon from 59-115-227-228.dynamic.h
老鼠的香香乳酪洞˙電子佈告欄系統˙alexbbs.twbbs.org˙140.113.166.7
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 6 篇):