Java 终结器如何与分代GC交互?

Java 终结器如何与分代GC交互?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,JVM确定对象符合垃圾收集条件后,调用Java的方法。对于这种情况何时发生,或者是否会在程序退出之前发生,没有真正的保证。我的问题是,finalize是否保证为实际上是垃圾收集的对象调用。我特别考虑的是一代GC中最年轻一代的对象 在分代GC中,最年轻的一代通常使用简单的标记扫描集合进行GC,其中只有活动对象被遍历并复制到新空间。因此,最年轻一代中的垃圾实际上不会被遍历。如果没有遍历垃圾,那么我们如何保证为成为垃圾的对象调用finalize?似乎a)不能保证在最年轻的一代中成为垃圾的这些对象将调用

JVM确定对象符合垃圾收集条件后,调用Java的方法。对于这种情况何时发生,或者是否会在程序退出之前发生,没有真正的保证。我的问题是,
finalize
是否保证为实际上是垃圾收集的对象调用。我特别考虑的是一代GC中最年轻一代的对象

在分代GC中,最年轻的一代通常使用简单的标记扫描集合进行GC,其中只有活动对象被遍历并复制到新空间。因此,最年轻一代中的垃圾实际上不会被遍历。如果没有遍历垃圾,那么我们如何保证为成为垃圾的对象调用
finalize
?似乎a)不能保证在最年轻的一代中成为垃圾的这些对象将调用
finalize
,或者b)可以保证调用
finalize
,但是覆盖
finalize
的对象的处理方式有所不同

我的问题是,是否保证为实际上是垃圾收集的对象调用finalize

实际上是的

实际的保证是最终回收对象之前将调用finalize方法

如果没有遍历垃圾,那么我们如何保证为成为垃圾的对象调用finalize呢

遍历(标记)期间不调用finalize方法。稍后在标记阶段未标记的对象上调用它。在标记阶段标记的任何对象都是可访问的。。。而不是填海的候选人



问题是,JVM如何知道哪些对象没有被标记?这似乎需要遍历托儿所中的所有对象,甚至是垃圾对象

这将是一种方法

另一种方法是有一个特殊的(非GC根)对象列表“可终结的”。清空活动对象后,将遍历该列表以检查所有可终结对象的旧空间副本。任何尚未撤离的难民都需要最后确定

也许还有其他的计划


如果您真的非常想知道它是如何完成的,那么垃圾收集器源是免费提供的。

这篇文章向您展示了可终结对象的一个实现是如何工作的。

问题是,JVM如何知道哪些对象没有被标记?这似乎需要遍历托儿所中的所有对象,甚至是那些垃圾。不,它只需要遍历“可终结”对象的特殊“列表”,看看它们是否被标记。@Björnantoson-我想我刚才说过了。见上文:-)见以下答案: