有效的Java说:
为什么使用终结器销毁对象会更慢?
最佳答案
由于垃圾收集器的工作方式。为了提高性能,大多数Java GC使用复制收集器,将短期对象分配到“eden”内存块中,当需要收集该代对象时,GC只需要复制那些仍然“活跃”到一个更永久的存储空间,然后它可以立即擦除(释放)整个“eden”存储块。这是有效的,因为大多数Java代码将创建生命周期只有几秒钟的对象的数千个实例(盒装原语,临时数组等)。
但是,当您具有终结器时,GC不能简单地一次擦除整个一代。相反,它需要找出该代中需要完成的所有对象,并将它们放在实际执行终结器的线程上排队。同时,GC无法有效地清理对象。因此,它要么必须使它们的生存期超过其应有的生存时间,要么必须延迟收集其他对象的时间,或者两者都延迟。另外,您还有实际执行终结器的任意等待时间。
所有这些因素加重了运行时间,这就是为什么通常首选确定性终结(使用close()
方法或类似方法来明确终结对象的状态)的原因。
关于java - 为什么终结器具有 “severe performance penalty”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2860121/