Tag: finalization

如何在Java中标记为最终化的对象(以便第二次不调用finalize方法)?

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

Java中最终化的目的是什么?

我对最终定稿的理解是这样的: 为了清理或回收对象占用的内存,垃圾收集器开始运行。 (自动被调用?) 垃圾收集器然后取消引用该对象。 有时,垃圾收集器无法访问该对象。 然后调用finalize进行最后的清理处理,之后可以调用垃圾收集器。 这是对最终确定的准确描述吗?