8

我知道你不能指望终结器来清理你的烂摊子(即免费资源),但我想知道 - 当 JVM 正常终止(System.exit()/没有线程)时,java 对象是否会被 GC'ed/finalized?

编辑:

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

4

1 回答 1

6

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

为什么被Runtime.runFinalizersOnExit弃用?

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

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

现在这个方法已经被弃用了,没有办法保证对象的最终确定。是否以及何时对对象进行垃圾收集完全取决于 JVM。

于 2013-08-06T06:29:14.527 回答