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