当前位置: 首页 > 知识库问答 >
问题:

“finalize()”方法是否总是由垃圾收集器在销毁“不可达”对象之前调用?

白永昌
2023-03-14

我从下面的链接中红色:来自geeksforgeeks的垃圾收集,这里说:

finalize() 方法永远不会对任何给定对象调用不止一次。

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

有可能吗?

共有1个答案

岳俊雅
2023-03-14

当GC发现一个对象的类中覆盖了finalize()时,它将被添加到对象队列中,以便对它们调用finalize()。只有在对象完成一次之后,GC才能清理它。也就是说,这将在以后的GC上。

例如,如果一个对象位于终身空间中,则可能会在执行完整的集合之前找到它,并且只有在调用finalize方法之后,才会在完整的GC中清除它。

有关更多细节,这是Java 11 Javadoc Forobject.finalize()

当对象在终结队列中时,它不能被移除。

并且您都假定垃圾回收器对对象的销毁是不确定的。

它不会被摧毁,而仍然有一个强有力的参考它。

 类似资料:
  • 我已经读到,在以下情况下,对象可以进行垃圾收集。 该对象的所有引用都显式设置为null 但是,是否有无论如何要标识的对象是合格的垃圾回收机制是由垃圾收集器收集?

  • 问题内容: 有没有一种方法可以检查垃圾收集器是否可以提取对象? 在我的代码中的某个地方,我有一个对象的引用: 然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null: 有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用? 非常感谢, 斯特凡 问题答案: 您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种

  • 问题内容: 在Java中,我做了很多类似的事情而没有考虑太多: 但是,最近我不确定这样做是否安全。毕竟,在对象创建之后就没有对它的引用了(嗯,有引用,但是这个值吗?),所以看起来存在垃圾回收器可能会在执行过程中删除该对象的危险的东西。因此,该方法应如下所示: 现在,我很确定第一个版本可以使用,并且我从未遇到任何问题,但是我想知道在所有情况下这样做是否安全(不仅在特定的JVM中,而且最好根据语言规范

  • 问题内容: 与同事进行了讨论。当诸如c#或java垃圾之类的语言收集诸如字符串之类的对象并将其返回到堆时,它们是否也清除了该内存块,例如用0或1覆盖? 我的假设是,除非按原样返回该块,除非使用诸如带有带有finalize重载的securestring之类的类将该块清零。 问题答案: 实际上,不,这不会发生。覆盖刚刚释放的内存需要花费时间,因此会有性能损失。“安全”之类的物体SecureString

  • 我在读关于Java的垃圾收集和finalize()方法的书,有一些疑问引起了我的注意。抱歉,如果你认为这些怀疑真的很愚蠢。 > 垃圾收集器如何知道它需要执行?例如,我有一个部署在服务器上的应用程序,那么垃圾收集器什么时候执行?它是否定期执行,或者当一些(比如1MB)垃圾被收集并执行触发器时,或者它只是随机的,没有办法确定它什么时候执行? 由于垃圾回收机制没有发生,它如何降低应用程序的性能? 假设我

  • 问题内容: 该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。 我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线