我们什么时候应该在java中使用finalize()方法?
如果我们想在finalize()方法中关闭连接,那么最好使用下面的代码来等待GC调用finalize()方法然后释放连接没有意义
try{
// Connection creation
}finally{
//close connection
}
所以问题是finalize()方法今天有没有相关性?
答案 0 :(得分:7)
确实最好通过显式调用方法来释放资源。终结者不一定要及时调用,甚至根本不调用。而且他们增加了性能损失。
但是,如果客户忘记明确处置,终结者仍可用作释放资源的安全网。
来自Joshua Bloch的“Effective Java”第二版中的“避免终结者”主题:
[D]不使用终结器,除非作为安全网或终止非关键性 本地资源。在极少数情况下,您使用终结器, 记得调用super.finalize。如果您使用终结器作为安全网, 记得记录终结器中的无效用法。
答案 1 :(得分:2)
我能想到使用finalize()
的唯一用例是:
假设您的类中有静态资源(成员),并且想要在卸载类时对该资源进行一些清理,完成或登录,那么您需要覆盖finalize()
方法并执行所有操作
答案 2 :(得分:1)
简短的回答永远不会。 Finalize()充满了微妙的问题,并且大大减慢了垃圾收集。
更长的答案是,也许在开发过程中,您可能需要检查重要的连接,文件,套接字或其他内容是否已关闭,如果没有,请记录警告,以便开发人员可以调查并正确解决问题
答案 3 :(得分:0)
finalize()
不仅释放像socket这样的资源,还管理内存。从理论上讲,您无需在代码中明确调用finalize()
。它由VM在适当的时间执行。
答案 4 :(得分:-1)
实际上finalize()
不应该被使用,特别是不应该用于清理资源。如果获取资源,从性能角度来看,最好显式释放资源,而不是等待JVM调用finalize()
。您无法预见JVM何时会调用finalize(),如果您完成了资源,那么您将不必要地持续更长时间。
我已经看到有人在finalize方法中使变量无效,这是另一个不好的做法,因为它通过扩展GC循环来减慢程序,完全不必要的代码行。 GC旨在处理非常好的死对象清理过程。