簡體   English   中英

什么時候應該在java中使用finalize()方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM