我一般认为清理资源是在finally块中完成的,
最近,我在一个类中发现了这个特殊的代码片段,它覆盖了Object类的finalize()方法。
protected void finalize() {
try {
In.close();
Out.close();
socket.close();
}
catch (Exception e) {
//logger code here
}
}这是个好主意吗?相对于finally,finalize()的优势和劣势是什么
发布于 2009-12-04 07:46:17
finally块只是一个始终在try块之后执行的代码块,即使有异常也是如此。即它的作用域是局部的
finalize()方法是一种在对象被垃圾回收时清理整个对象的方法。
Java documentation of finalize()
finally解决了清理代码块中的资源而不管是否发生异常情况的问题……当您的对象不再被使用时,一旦垃圾收集器确定不再有对该对象的引用,finalize()就是一种清理资源的方法。
简而言之,为了回答您的问题,例如,如果您要关闭的套接字是某个对象的成员,那么您应该在finalize()方法中关闭它们(尽管这不是最优的,例如,因为不能保证GC何时会实际执行操作)。
但是,如果您在一个方法中打开套接字,并在该方法结束时使用它,那么您应该释放finally块中的资源。
发布于 2009-12-04 07:45:55
总是在最后把事情清理干净。
不能保证在finalize中进行清理。
然而,经常发现在finalizer中清理这类东西,作为最后一道安全阀,以防finally块向您抛出另一个异常。
依赖终结器的真正问题是,在GC调用终结器之前,其他东西可能需要资源。
发布于 2009-12-04 08:12:34
Phantom引用会做你想做的事情。
只是不要使用finalize。在一些边缘情况下,它可能会有帮助(当一个类被GC'd时打印调试信息是有用的),但通常不是这样的,JVM合同中甚至没有任何东西说它必须被调用。
有一种被称为“引用”的非常低调的对象类型。一种是显式地为您认为将使用finalize的东西创建的。
Phantom reference对象,在收集器确定其引用对象可能被回收后,将这些对象排入队列。
我突然想到一定有a description of this on the web--所以我将用这个引用替换我刚刚写的所有“如何操作”的东西。
https://stackoverflow.com/questions/1843905
复制相似问题