JAVA對象的finalize()方法

finalize

  1. java的GC只負責內存相關的清理,全部其它資源的清理必須由程序員手工完成。要否則會引發資源泄露,有可能致使程序崩潰。java

  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編程思想》。

相關文章
相關標籤/搜索