Re: [重編] 談談 Java 語言的垃圾收集器

看板java作者時間19年前 (2006/08/12 02:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/6 (看更多)
※ 引述《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
文章代碼(AID): #14tCNh00 (java)
討論串 (同標題文章)
文章代碼(AID): #14tCNh00 (java)