据我了解,GC从一组初始对象(堆栈,静态对象)开始,然后递归遍历它,以建立可达对象图。然后,将这些对象占用的内存标记为已占用,并假定其余所有内存均已释放。
但是,如果此“空闲”内存包含具有finalize方法的对象怎么办?GC必须调用它,但是我不知道它怎么能知道不再可访问的对象。
我想GC可以在所有“可完成的”对象存活时对其进行跟踪。如果是这样,拥有可终结化的对象是否会使垃圾回收即使在它们还活着的情况下也变得更加昂贵?
我正在阅读这篇文章,我无法真正理解最终化对象(覆盖该finalize方法的对象)在回收之前至少需要2个GC周期.
在可回收可完成对象之前,它至少需要两次垃圾收集周期(在最好的情况下).
有人还可以详细解释一个可终结的对象如何可以采用多个GC循环进行回收?
我的逻辑论点是,当我们覆盖finalize方法时,运行时必须使用垃圾收集器注册此对象(以便GC可以调用finalize此对象,这使我认为GC将引用所有可终结的对象).为此,GC必须对可终结对象保持强有力的参考.如果是这种情况,那么该对象如何成为GC首先进行回收的候选对象?我通过这个理论达成了矛盾.
PS:我知道覆盖finalize不是推荐的方法,并且自Java 9以来不推荐使用此方法.