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