【问题标题】:Do finalizers (and ReferenceQueue's) run on JVM termination? [duplicate]终结器(和 ReferenceQueue 的)是否在 JVM 终止时运行? [复制]
【发布时间】:2013-08-06 06:18:16
【问题描述】:

我知道you can't count on finalizers 可以清理你的烂摊子(即免费资源),但我想知道 - 当 JVM 正常终止时,java 对象是否会被 GC 处理/最终确定(System.exit() / 没有剩余线程)?

编辑:

所以,GC 不保证会被触发,因此finalize() 也不保证,但是 ReferenceQueue 会起作用吗?

【问题讨论】:

  • 那是关于 CLR 的文档,而不是你链接到的 JVM
  • 嗯,有System.runFinalizersOnExit(),但它已被弃用。无论如何,当你退出一个进程时,最终清理的是操作系统。现在,为什么要问这个问题?
  • 也许您需要使用Runtime.addShutdownHook() 添加一些关机触发器!没有关于调用 finalize 的保证,如果系统调用了,也没有保证让 finalize 做它想做的一切。
  • @DenisTulskiy:这是一篇概念性文章。 fge:这是一个概念性的问题。但还有——我不想释放分配的资源(即删除文件)。用户:shutdownHook 可能是一个很好的解决方案。
  • 那些是 cmets 而不是答案。随意不相信我:-)

标签: java garbage-collection jvm termination


【解决方案1】:

有一段时间,有一个方法Runtime.runFinalizersOnExit 可以用参数true 调用,以保证在VM 关闭之前完成所有对象。该方法现在已被弃用,原因在页面底部的 http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html 的 java 文档中记录。这是相关部分:

为什么不推荐使用Runtime.runFinalizersOnExit

因为它本质上是不安全的。这可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致行为不稳定或死锁。如果将要完成对象的类编码为“防御”此调用,则可以防止此问题,但大多数程序员不会防御它。他们假设一个对象在其终结器被调用时已经死亡。

此外,调用不是“线程安全的”,因为它设置了一个 VM 全局标志。这迫使每个班级都有一个 终结器来防御活动对象的终结!

现在此方法已被弃用,无法保证对象最终确定。是否以及何时对对象进行垃圾收集完全取决于 JVM。

【讨论】:

  • 您是否也有任何关于References 的参考资料(他们会在关机时排队)吗?只是我看不出Reference 的入队可能会导致上述文章中提出的任何问题。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 2020-12-04
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多