Re: [問題] 請教一道GC題目

看板java作者時間17年前 (2007/03/16 04:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串8/9 (看更多)
※ 引述《Franckie.bbs@ptt.cc (as simple as possible)》之銘言: : ※ 引述《gp20 ()》之銘言: : : public class GC { : : private Object o ; : : private void dosomethingElse(Object obj){o = obj ; } : : public void dosomething() { : : Object o = new Object() ;//第5行 : : dosomethingElse(o) ;//第6行 : : o = new Object() ;//第7行 : : dosomethingElse(null) ;//第8行 : : o = null ;//第9行 : : }//第10行 : : } : : When doSomething method is called, after which line does Object created in : : line 5 become available for garbage collection ? : : 書中給的答案是,第7行後第五行被created的Object才可以被GC : : 但是我覺得是第8行耶 : : 因為到第7行的時候產生的Object仍然被GC內的成員o所reference : : 應該要到第8行讓它也指向null後,之前產生的Object才能被GC : : 不知道板友們的看法是? : : 謝謝唷… : 第五行所產生的Object只被 o 所 reference : 第七行把 o reference 到另外一個Object : 如此一來第五行所產生的Object就沒有被reference到 : 所以就可以被GC了 隨然是討論 但是如果自己沒先稍微確定一下就回文 是蠻有可能誤導別人的 這問題 有台電腦 裝了java 就可以試出來了 提供簡單的方法: 把這問題裡面的new Object()改成new ABC("a name") class ABC{ String name; public ABC(String n) {name = n;} protected void finalize() throws Throwable { System.out.println("GC: " + name); } } 在dosomething()裡面每行statement後面加上System.gc(); 1.把第8行和第9行註解起來, 然後編譯並執行 ==> 在程式結束前, 沒人被GC 2.只註解第9行, 然後編譯並執行 ==> 第5行建立的物件被GC, 3.只註解第8行, 然後編譯並執行 ==> 第7行建立的物件被GC, 4.不註解任何行, 然後編譯並執行 ==> 第5行的物件先被GC, 然後是第7行的物件被GC 結論: 執行第8行可讓第5行的物件被GC 執行第9行可讓第7行的物件被GC -- ※Post by leon from 59-115-236-130.dynamic.h 老鼠的香香乳酪洞˙電子佈告欄系統˙alexbbs.twbbs.org˙140.113.166.7
文章代碼(AID): #15-QN-00 (java)
討論串 (同標題文章)
文章代碼(AID): #15-QN-00 (java)