JAVA物件的finalize()方法
finalize
-
java的GC只負責記憶體相關的清理,所有其它資源的清理必須由程式設計師手工完成。要不然會引起資源洩露,有可能導致程式崩潰。
-
呼叫GC並不保證GC實際執行。
-
finalize丟擲的未捕獲異常只會導致該物件的finalize執行退出。
-
使用者可以自己呼叫物件的finalize方法,但是這種呼叫是正常的方法呼叫,和物件的銷燬過程無關。
-
JVM保證在一個物件所佔用的記憶體被回收之前,如果它實現了finalize方法,則該方法一定會被呼叫。Object的預設finalize什麼都不做,為了效率,GC可以認為一個什麼都不做的finalize不存在。
作用
-
finalize()是Object的protected方法,子類可以覆蓋該方法以實現資源清理工作,GC在回收物件之前呼叫該方法。
-
finalize()與C++中的解構函式不是對應的。C++中的解構函式呼叫的時機是確定的(物件離開作用域或delete掉),但Java中的finalize的呼叫具有不確定性
-
不建議用finalize方法完成“非記憶體資源”的清理工作,但建議用於:
① 清理本地物件(通過JNI建立的物件); ② 作為確保某些非記憶體資源(如Socket、檔案等)釋放的一個補充: 在finalize方法中顯式呼叫其他資源釋放方法。其原因可見下文[finalize的問題]
毛病
-
物件必須覆寫了finalize()方法
-
finalize()只會在物件記憶體回收前被呼叫一次
-
finalize()的呼叫具有不確定行,只保證方法會呼叫,但不保證方法裡的任務會被執行完(比如一個物件手腳不夠利索,磨磨嘰嘰,還在自救的過程中,被殺死回收了)。
總結
finalize()方法並沒有什麼鳥用,(並且在新版JAVA中已被棄用)。
至於為什麼會存在一個雞肋的方法:書中說“它不是C/C++中的解構函式,而是Java剛誕生時為了使C/C++程式設計師更容易接受它所做出的一個妥協”《JAVA程