unj*_*nj2 24 java performance memory-management finalizer object-destruction
有效的Java说:
使用终结器会严重影响性能.
为什么使用终结器破坏对象的速度较慢?
Dan*_*den 23
因为垃圾收集器的工作方式.为了提高性能,大多数Java GC使用复制收集器,其中将短期对象分配到"eden"内存块中,当需要收集该对象生成时,GC只需要复制那些对象.仍然"活着"到更永久的存储空间,然后它可以立即擦除(释放)整个"eden"内存块.这是有效的,因为大多数Java代码将创建数千个对象实例(盒装基元,临时数组等),其生命周期仅为几秒.
但是,当您在混合中使用终结器时,GC不能简单地一次擦除整个代.相反,它需要弄清楚那一代中需要最终确定的所有对象,并将它们排队到实际执行终结器的线程上.与此同时,GC无法有效地清理对象.因此要么让它们保持活动的时间超过它们应该的时间,要么它必须延迟收集其他物体,或两者兼而有之.另外,你有实际执行终结器的任意等待时间.
所有这些因素都会导致显着的运行时损失,这就是为什么close()通常首选确定性终结(使用方法或类似方法来显式确定对象的状态).
Sbo*_*odd 10
实际遇到一个这样的问题:
在Sun HotSpot JVM中,终结器在给定固定的低优先级的线程上处理.在高负载应用程序中,与低优先级的终结线程可以处理它们相比,可以更容易地创建所需的终结所需对象.同时,finalization-pending对象使用的堆上的空间不可用于其他用途.最终,您的应用程序可能会花费所有时间进行垃圾回收,因为待完成的对象正在使用所有可用内存.
当然,这是除了使用Effective Java中描述的终结器的其他许多原因之外.
| 归档时间: |
|
| 查看次数: |
5143 次 |
| 最近记录: |