[英]When should be we use finalize() method in java?
我們什么時候應該在java中使用finalize()方法?
如果我們想在finalize()方法中關閉連接,那么最好使用下面的代碼等待GC調用finalize()方法然后釋放連接沒有意義
try{
// Connection creation
}finally{
//close connection
}
所以問題是finalize()方法今天有沒有相關性?
確實最好通過顯式調用方法來釋放資源。 終結者不一定要及時調用,甚至根本不調用。 而且他們增加了性能損失。
但是,如果客戶忘記明確處置,終結者仍可用作釋放資源的安全網。
來自Joshua Bloch的“Effective Java”中的“避免終結者”主題,第2版:
[D]不使用終結器,除非作為安全網或終止非關鍵的本地資源。 在您使用終結器的極少數情況下,請記住調用super.finalize。 如果您使用終結器作為安全網,請記住記錄終結器中的無效用法。
我可以想到使用finalize()
的唯一用例是:
假設您的類中有一個靜態資源(成員),並且想要在卸載類時對該資源執行一些清理,完成或登錄,那么您需要覆蓋finalize()
方法並執行所有操作。
簡短的回答永遠不會。 Finalize()充滿了微妙的問題,並且大大減慢了垃圾收集。
更長的答案是,也許,在開發期間,您可能想要檢查重要的連接,文件,套接字或其他任何內容是否已關閉,如果沒有,請記錄警告,以便開發人員可以調查並正確解決問題。
finalize()
不僅釋放像socket這樣的資源,還管理內存。 從理論上講,您不需要在代碼中顯式調用finalize()
。 它由VM在適當的時間執行。
實際上finalize()
不應該被使用,特別是不應該用於清理資源。 如果獲取資源,從性能角度來看,最好顯式釋放資源,而不是等待JVM調用finalize()
。 您無法預見JVM何時會調用finalize(),如果您完成了資源,那么您將不必要地持續更長時間。 我已經看到有人在finalize方法中使變量無效,這是另一個不好的做法,因為它通過擴展GC循環來減慢程序,完全不必要的代碼行。 GC旨在處理非常好的死對象清理過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.