Java 是';最终确定();方法在销毁';遥不可及';对象

Java 是';最终确定();方法在销毁';遥不可及';对象,java,garbage-collection,jvm,finalize,Java,Garbage Collection,Jvm,Finalize,我从以下链接看到红色: 据说: 对于任何给定对象,finalize()方法的调用次数不会超过一次 所以,这里说的是“不止一次”,我想知道是否有可能不调用finalize()方法,垃圾收集器会销毁该对象 有可能吗?当GC找到一个类为的对象,该类中的finalize()已被重写时,它将被添加到对象队列中,以便对其调用finalize()。只有在对象完成一次之后,GC才能清理它。i、 e.这将在以后的GC上进行 e、 g.如果对象位于永久空间中,则可能会在执行完整收集之前找到它,并且只有在调用fina

我从以下链接看到红色: 据说:

对于任何给定对象,finalize()方法的调用次数不会超过一次

所以,这里说的是“不止一次”,我想知道是否有可能不调用finalize()方法,垃圾收集器会销毁该对象


有可能吗?

当GC找到一个类为的对象,该类中的
finalize()
已被重写时,它将被添加到对象队列中,以便对其调用finalize()。只有在对象完成一次之后,GC才能清理它。i、 e.这将在以后的GC上进行

e、 g.如果对象位于永久空间中,则可能会在执行完整收集之前找到它,并且只有在调用finalize方法之后,才会在完整GC上清理它

有关更多详细信息,请参阅Java 11 Javadoc For
Object.finalize()

那么,有没有可能垃圾收集器完全销毁了堆中的对象,但没有对该对象调用finalize()方法

当对象位于终结队列中时,无法将其删除

你们都认为垃圾收集器销毁对象是不确定的


当仍然有对它的强引用时,它不会被销毁。

可能会有所帮助。新插入的块是错误的。即使垃圾收集器运行,也不能保证执行
finalize()
方法。“绝对”这个词在这里不合适。垃圾回收器所做的就是让需要终结的对象排队。一个或多个终结器线程可能会处理它们,但JVM可能会在它们到达特定对象之前终止。此外,JVM根本不需要支持终结。第二,当你在下面重复错误的陈述并说你把它变得简单时,错误的陈述并不会变得更好。这并不简单,它仍然是错误的。当你知道有一个已经存在的问答可以更好地涵盖这个主题时,你可以删除你的问题。是的,请删除,除非你能让它变得更好,并且与链接的答案不同。我认为没有人注意到这个问题的确切含义。我的问题是:假设垃圾收集器肯定会运行来销毁堆中的特定对象(也就是说,垃圾收集器肯定会销毁该对象)那么,有没有可能垃圾收集器完全销毁了堆中的对象,但没有对该对象调用finalize()方法?你们都认为垃圾收集器销毁对象是不确定的。现在更清楚了吗?“它不会被销毁,因为仍然有一个很强的引用。”这是不必要的,因为问题是假设对象肯定会被GC销毁。我只想要这个答案:“只有在对象完成一次之后,GC才能清理它。”谢谢@用户10086840或换句话说;在调用object.finalize()之前,将有一个对它的强引用。这是一个错误的术语。如果存在对某个对象的强引用,则该对象不符合终结条件,因此在“调用object.finalize()之前”不能说存在对该对象的强引用。如“A”中所讨论的,JVM可以考虑当后续计算没有触及时,对象无法到达,即使方法调用仍在进行中。这也适用于
finalize()
方法的执行。因此,它可能会在对象之前“销毁”一个对象,但是你不会注意到……Peter Lawrey.your语句:“直到对象.FialIZE()被调用为止,将有一个很强的引用。”我认为这是不正确的,因为考虑到一个不可到达的对象,它是由GC检测到的,并被放置在终结队列中,现在FialalIZE()方法尚未调用,并且没有对它的强引用。所以你的上述陈述对本案不成立。