终结器(和ReferenceQueue)是否在JVM终止上运行?

时间:2013-08-06 06:18:16

标签: java garbage-collection jvm termination

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

编辑:

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

1 个答案:

答案 0 :(得分:6)

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

  

为什么Runtime.runFinalizersOnExit已被弃用?

     

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

     

此外,在设置VM全局标志的意义上,调用不是“线程安全的”。这迫使每个班级都有一个   终结者,以防止活动对象的最终确定!

既然已弃用此方法,则无法保证对象终结。是否以及何时垃圾收集对象完全取决于JVM。