主要问题在主题中,但让我展示一下我对 Java 完成过程的看法,以便我可以再问你一点。
那么 gc 通过标记所有活动对象开始垃圾收集。当所有可达对象都被标记为“活动”时。所有其他对象都无法访问。下一步是检查每个无法到达的对象,并确定它是否可以立即被清扫,或者应该首先完成。如果对象的 finalize 方法有一个主体,那么 gc 会考虑下一个方法,那么这个对象是可终结的并且应该被终结;如果对象的 finalize 方法有一个空主体(受保护的 void finalize(){ }),那么它是不可终结的,现在可以被 gc 清除。(我说得对吗?)
所有可终结的对象都将放在同一个队列中,以便稍后一一终结。据我了解,一个可终结的对象在等待轮到它最终确定时可能会花费大量时间被放入队列中。这可能会发生,因为通常只有一个名为 Finalizer 的线程从队列中获取对象并调用它们的 finalize 方法,并且当我们在某个对象的 finalize 方法中进行一些耗时的操作时,队列中的其他对象将等待很长时间才能完成。好吧,当一个对象已经完成时,它会被标记为 FINALIZED 并从队列中删除。在下一个垃圾收集过程中,收集器将看到该对象(再次)无法访问并且具有非空的 finalize 方法(再次)所以该对象应该被放入队列中(再次) - 但它不会因为收集器以某种方式看到这个对象被标记为 FINALIZED。(这是我的主要问题:这个对象以什么方式被标记为 FINALIZED,收集器如何知道这个对象不应该再次被最终确定?)