Java 的finalize
方法在 JVM 确定一个对象符合垃圾回收条件后被调用。没有真正的保证何时会发生这种情况,或者它是否会在程序退出之前发生。我的问题是是否finalize
保证为实际上是垃圾收集的对象调用。我特别在考虑最年轻一代的分代 GC 中的对象。
在分代 GC 中,最年轻的代通常会使用简单的标记清除收集进行 GC,其中只有活动对象被遍历并复制到新空间。因此,实际上并没有遍历最年轻代中的垃圾。如果垃圾没有被遍历,那么我们如何保证finalize
对变成垃圾的对象调用呢?似乎a)不能保证finalize
会为这些在最年轻一代中变成垃圾的对象调用,或者b)有保证finalize
会被调用,但是覆盖finalize
的对象以某种方式处理不同。