我知道you can't count on finalizers来清理你的烂摊子(即免费资源),但我想知道 - 当JVM正常终止时(System.exit()
/没有线程离开时,java对象会被GC /最终确定) )?
因此,不保证会触发GC,因此也不会finalize()
,但是ReferenceQueue会起作用吗?
答案 0 :(得分:6)
有一段时间,有一个方法Runtime.runFinalizersOnExit
可以使用参数true
调用,以保证在VM关闭之前完成所有对象。该方法现已弃用,原因在于页面底部http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html的java文档中记录的原因。这是相关部分:
为什么
Runtime.runFinalizersOnExit
已被弃用?因为它本质上是不安全的。它可能导致在活动对象上调用终结器,而其他线程同时操作这些对象,从而导致不稳定的行为或死锁。虽然如果对象正在最终确定的类被编码为“防御”此调用,则可以防止此问题,但大多数程序员不会对其进行防御。他们假设一个对象在调用终结器时已经死了。
此外,在设置VM全局标志的意义上,调用不是“线程安全的”。这迫使每个班级都有一个 终结者,以防止活动对象的最终确定!
既然已弃用此方法,则无法保证对象终结。是否以及何时垃圾收集对象完全取决于JVM。