什么时候应该在Java中使用finalize()方法?
如果我们想在finalize()方法中关闭连接,那么最好使用下面的代码,因为等待GC调用finalize()方法然后释放连接是没有意义的。
try{
// Connection creation
}finally{
//close connection
}
那么问题是,finalize() 方法今天是否有任何相关性?
什么时候应该在Java中使用finalize()方法?
如果我们想在finalize()方法中关闭连接,那么最好使用下面的代码,因为等待GC调用finalize()方法然后释放连接是没有意义的。
try{
// Connection creation
}finally{
//close connection
}
那么问题是,finalize() 方法今天是否有任何相关性?
我所能想到应用finalize()
方法的唯一场景是:
假设您在类中有一个静态资源(成员),并且希望在卸载类时对该资源进行一些清理、完成或日志记录,则需要重写finalize()
方法并执行所有相关操作。
singleton
对象,在应用程序的生命周期中只加载和卸载一次(在关闭时),而你的应用程序恰好是一个POJO,你没有任何框架提供的关闭/销毁钩子,那该怎么办? - anubhavafinalize()
不仅释放像套接字这样的资源,还管理内存。理论上讲,在代码中您不需要显式调用finalize()
。它会在适当的时间由虚拟机执行。
finalize()
。我认为finalize()
函数很像 C++
中的 destructor
。如果您要重写它,那么肯定与资源释放有关。然而,大多数情况下 JVM 会帮助您正确地完成它。快速搜索给了我这个链接 http://www.google.com.hk/#hl=zh-CN&newwindow=1&safe=strict&sa=X&ei=2_T9ToWFCMqTiQeT1sntCg&ved=0CBkQvwUoAQ&q=when+to+override+finalize+java&spell=1&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=a828595b5987e1c0&biw=1308&bih=596,我认为前三个链接可能会有所帮助。 - Summer_More_More_Teafinalize
与C++中的析构函数绝对不相似。析构函数是确定性的,这使它们在RAII方面非常有用。finalize
存在一些问题,最重要的是除了查找错误之外几乎没有任何用处。最好不要使用它们-特别是如果您不理解底层发生了什么(即JVM何时运行finalizer以及其后果)。 - Voofinalize()
方法不应该被使用,特别是不应该用于清理资源。如果已经获取了某个资源,从性能的角度来看,最好显式地释放该资源,而不是等待 JVM 调用 finalize()
。你无法预见 JVM 何时会调用 finalize(),如果你已经完成了对资源的使用,那么你会不必要地持有它更长的时间。我曾经看到有人在 finalize 方法中将变量置为 null,这是另一种不良实践,因为它通过完全不必要的代码行扩展了 GC 周期,从而减慢了程序的速度。GC 能够很好地处理死亡对象的清理过程。