在破坏“无法到达”对象之前,垃圾收集器是否总是调用“ finalize()”方法?

时间:2018-10-03 14:24:07

标签: java garbage-collection jvm finalize

我通过以下链接变红了:garbage collection from geeksforgeeks 据说:

  

对于任何给定的对象,finalize()方法永远不会被多次调用。

因此,这里所说的“不止一次”,我想知道是否有可能不调用 finalize() 方法而垃圾收集器会破坏该方法对象。

有可能吗?

1 个答案:

答案 0 :(得分:2)

当GC找到一个对象,其中的类中的finalize()已被覆盖时,会将其添加到对象队列中,以对它们调用finalize()。只有在对象最终完成一次之后,GC才能清理它。即在以后的GC中使用。

例如如果某个对象位于使用权空间中,则可能要等到执行完整收集后才能找到它,并且只有在调用finalize方法之后,才会在完整GC上对其进行清理。

有关更多详细信息,这是Object.finalize()的Java 11 Javadoc

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#finalize()

  

那么垃圾回收器是否有可能完全破坏了堆中的对象,但没有对该对象调用finalize()方法?

虽然该对象位于完成队列中,但无法将其删除。

  

你们都认为垃圾回收器销毁对象没有确定性。

它仍然有很强的参考力,不会被销毁。