是什么让终结者如此昂贵?

Gee*_*eek 5 java finalizer

来自Effective Java:

哦,还有一件事:使用终结器会有严重的性能损失.在我的机器上,创建和销毁一个简单对象的时间约为5.6 ns.添加终结器可将时间增加到2,400 ns.换句话说,使用终结器创建和销毁对象的速度大约低430倍.

是什么让终结者如此昂贵?

Mar*_*nik 5

关键的区别在于终结器方法的存在,无论它做什么.一旦GC具有可最终确定的对象,就必须更加努力地使所有的内务处理正确.它必须将它们标记为可最终化,将它们保存在池中,运行最终化,检查它们是否在此之后复活,通过最终化代码处理所有类型的多线程问题,等等.

GC的年轻一代最明显地看出差异:在一个乐观的,并非完全罕见的情况下,GC可以归结为单个操作:将指针递减到第一个可用的内存地址.对于终结器,它是上面概述的整个过程.


nat*_*don 5

http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html

从上面的链接中提取

具有终结器的对象(具有非平凡的finalize()方法的对象)与没有终结器的对象相比具有显着的开销,并且应该谨慎使用.可完成对象的分配速度较慢,收集速度较慢.在分配时,JVM必须使用垃圾收集器注册任何可终结对象,并且(至少在HotSpot JVM实现中)可完成对象必须遵循比大多数其他对象更慢的分配路径.同样,可完成对象的收集速度也较慢.在可回收可完成对象之前,它至少需要两次垃圾收集周期(在最好的情况下),并且垃圾收集器必须做额外的工作来调用终结器.其结果是花费分配和收集对象和垃圾收集更多的压力更多的时间,因为由不可达finalizeable对象使用的存储器被保持更长的时间.将其与终结器无法保证在任何可预测的时间范围内运行甚至根本不运行这一事实相结合,您可以看到相对较少的情况,最终确定是正确的工具.