什么时候应该在java中使用finalize()方法?

时间:2011-12-30 17:16:10

标签: java

我们什么时候应该在java中使用finalize()方法?

如果我们想在finalize()方法中关闭连接,那么最好使用下面的代码来等待GC调用finalize()方法然后释放连接没有意义

try{
// Connection creation
}finally{
//close connection
}

所以问题是finalize()方法今天有没有相关性?

5 个答案:

答案 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旨在处理非常好的死对象清理过程。