1. 程式人生 > >JAVA物件的finalize()方法

JAVA物件的finalize()方法

finalize

  1. java的GC只負責記憶體相關的清理,所有其它資源的清理必須由程式設計師手工完成。要不然會引起資源洩露,有可能導致程式崩潰。

  2. 呼叫GC並不保證GC實際執行。

  3. finalize丟擲的未捕獲異常只會導致該物件的finalize執行退出。

  4. 使用者可以自己呼叫物件的finalize方法,但是這種呼叫是正常的方法呼叫,和物件的銷燬過程無關。

  5. JVM保證在一個物件所佔用的記憶體被回收之前,如果它實現了finalize方法,則該方法一定會被呼叫。Object的預設finalize什麼都不做,為了效率,GC可以認為一個什麼都不做的finalize不存在。

作用

  1. finalize()是Object的protected方法,子類可以覆蓋該方法以實現資源清理工作,GC在回收物件之前呼叫該方法。

  2. finalize()與C++中的解構函式不是對應的。C++中的解構函式呼叫的時機是確定的(物件離開作用域或delete掉),但Java中的finalize的呼叫具有不確定性

  3. 不建議用finalize方法完成“非記憶體資源”的清理工作,但建議用於:

    ① 清理本地物件(通過JNI建立的物件); ② 作為確保某些非記憶體資源(如Socket、檔案等)釋放的一個補充: 在finalize方法中顯式呼叫其他資源釋放方法。其原因可見下文[finalize的問題]

毛病

  1. 物件必須覆寫了finalize()方法

  2. finalize()只會在物件記憶體回收前被呼叫一次

  3. finalize()的呼叫具有不確定行,只保證方法會呼叫,但不保證方法裡的任務會被執行完(比如一個物件手腳不夠利索,磨磨嘰嘰,還在自救的過程中,被殺死回收了)。

總結

finalize()方法並沒有什麼鳥用,(並且在新版JAVA中已被棄用)。

至於為什麼會存在一個雞肋的方法:書中說“它不是C/C++中的解構函式,而是Java剛誕生時為了使C/C++程式設計師更容易接受它所做出的一個妥協”《JAVA程