2008年3月14日 星期五

M08 規範所有物件的生成與消滅

在執行Method的時候如果需要用到Class裡的物件,大家都知道要預先準備妥當,不管是事先將物件放置好或是由Method傳入;在消滅Class的時候大家都相信J VM的Garbage Collection,所以大多都只是把放置物件的變數設為null後便將之遺忘,任由執行環境將之回收。

然而執行環境也有回收失敗的時候,例如下面的例子:
// 在方法內生成物件的時候. target與list是Class內宣告的Object與List.
target = new Object();
list.add(target);
// 在target不用的時候
target = null;

在消滅target的時候只對它設置為null,卻忘記它在list裡還存放著reference,以致於target物件根本無法被回收;這種現象一多,執行的記憶體遲早會被佔用光而造成系統異常結束。此現象稱為Memory Leakage,是系統問題最難排除的一種,因為根本很難判定哪裡佔用了應該釋放掉的物件。

“需要的時候已經產生好隨時可用,不要的時候有沒有消滅掉都無所謂”,如果對於物件的管理只看重需要的時候,那麼其實是沒有秩序可言的。萬物的生滅應該有其道理,所以在設計裡應該也要將每個物件的生滅視為一種應該詳細定義的規格。

沒有留言:

張貼留言