java - 为什么终结器会有“严重的性能损失”?

标签 java performance memory-management finalizer object-destruction

有效的Java说:
使用终结器会造成严重的性能损失。
为什么使用终结器销毁对象较慢?

最佳答案

因为垃圾收集器的工作方式。对于性能,大多数Java GCS使用复制收集器,其中短命对象被分配到“EDEN”内存块中,并且当它的时间被收集到这一代对象时,GC只需要将仍然活着的对象复制到更持久的存储空间,并且然后它可以一次擦除(释放)整个“伊甸园”内存块。这是有效的,因为大多数Java代码将创建数千个对象实例(装箱原语、临时数组等),寿命只有几秒钟。
但是,当在组合中有终结器时,GC不能简单地一次擦除整个代。相反,它需要找出该代中需要完成的所有对象,并将它们排队到实际执行终结器的线程上。同时,GC不能有效地完成对对象的清理。因此,它要么让它们活得比应该的时间长,要么延迟收集其他物体,或者两者兼而有之。另外,您还有实际执行终结器的任意等待时间。
所有这些因素加起来对运行时有很大的影响,这就是为什么通常首选确定性终结(使用close()方法或类似于显式终结对象状态的方法)。

本文翻译自 https://stackoverflow.com/questions/2860121/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。


相关文章:

java - Android活动堆栈控件。无法弄清楚如何删除历史记录

java - JButton和actionPerformed方法是否可能在不同的文件中?

.net - System.Data.SQLite慢速连接非管理员用户

java - 在释放对象和垃圾回收后,Java仍然使用系统内存

c# - 我应该在使用大对象堆之后立即调用GC.Collect来防止碎片

java - 如何刷新其中带有BufferedImage的JFrame?

java - OpenSAML 3解组器为null

java - Java:通过HashMap迭代,哪个更有效?

git - Git DEFLATE /优化的zlib

java - 什么是Java内存管理最佳实践? [关闭]