Object.finalize()是做什么的?

5

finalize()是java.lang.Object类中的9个方法之一。该函数的api文档如下:

当垃圾回收确定没有更多引用对象时,由垃圾回收器在对象上调用。

  • 但是finalize()方法实际上是做什么的?
  • 如果我们手动调用finalize()方法会发生什么?
2个回答

1

默认情况下它不会执行任何操作,但是如果您想执行某些操作,它提供了拦截点

这是java.lang.Objectfinalize()的实现。

  protected void finalize() throws Throwable { }

finalize的一般契约是,当Java虚拟机确定没有任何线程可以访问此对象(除非另一个准备进行终止的对象或类采取的操作),而这些线程尚未死亡时,将调用它。finalize方法可以执行任何操作,包括使此对象再次可供其他线程使用;但是,finalize的通常目的是在对象被不可撤销地丢弃之前执行清理操作。例如,表示输入/输出连接的对象的finalize方法可能会执行显式I/O事务以断开连接,然后才永久丢弃该对象。

参见


我认为值得注意的是,虽然没有什么特别的防止finalize使一个对象复活,但一个复活自己的对象通常无法知道它所持有引用的任何对象是否会在将来某个不确定的时间运行它们的finalize方法。 - supercat

0

我认为有一个规则:永远不要在正常情况下使用它。只有在教育目的和调试目的下,才是可接受的。

默认情况下,它什么也不做。你可以重写它,以便找出你的垃圾回收器是否正在清理对象。但是,永远不要将清理逻辑放入该方法中。因此,如果你遇到内存问题,检查特定对象是否释放了内存可能会有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接