《Effective Java》中说:
使用finalizer会造成严重的性能损失。
为什么使用finalizer来销毁一个对象会更慢呢?
《Effective Java》中说:
使用finalizer会造成严重的性能损失。
为什么使用finalizer来销毁一个对象会更慢呢?
close()
方法之类的显式finalizer)的原因。FileOutputStream
。因此,某些对象的终结器不太可能延迟不使用终结器的对象的垃圾回收,因为大多数程序都会受到影响。 - RaedwaldFileOutputStream
的实现有一个finalizer。(我找不到任何需要标准库实现使用finalizers的东西,但是在实践中,虽然对象本来符合GC的条件,但仍处于等待finalization的状态,它们只会被提升到下一个较老的代(survivor space或tenured),而finalizer则排队运行。但是实际的内存回收要等到下一次收集下一个较老的代时才会进行。 - Daniel Prydenclose()
和 finalize()
,如果我们显式调用 close()
,是否也会发生这种开销? - Gerardo Cauich曾经遭遇过一个问题:
在Sun HotSpot JVM中,finalizer会在一个被赋予固定低优先级的线程上运行。在高负载应用程序中,很容易创建出需要执行finalization的对象,但低优先级的finalization线程无法及时处理它们。与此同时, finalization-pending对象所占用的堆空间也无法供其他用途使用。最终,你的应用程序可能会因为所有可用内存都被处于待finalization状态的对象所占用而花费所有时间进行垃圾回收。
当然,这还要加之前述Effective Java中描述的不使用finalizers的其他原因。