※ 引述《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
討論串 (同標題文章)
完整討論串 (本文為第 8 之 9 篇):