编程语言
首页 > 编程语言> > java – 如果我们覆盖finalize方法,为什么可以增加分配阶段?

java – 如果我们覆盖finalize方法,为什么可以增加分配阶段?

作者:互联网

我听说在Joshua Bloch的书中写道,如果我们覆盖finalize方法,分配和内存收集可能会增加到430倍.

对我来说很明显,内存收集可以更慢地工作,因为gc需要额外的迭代来释放内存.

但为什么分配阶段可以增加?

解决方法:

我搜索了原始声明:

On my machine, the time to create and destroy a simple object is about
5.6 ns. Adding a finalizer increases the time to 2,400 ns. In other words, it is about
430 times slower to create and destroy objects with finalizers.

所以这不是一般性陈述,而只是一份证据报告,表明其背后有一种模式,而不是数字是可重复的.当使用不那么重要的对象或只是更多的对象时,这个因素可能会改变.

当然,这些成本取决于如何实际完成最终确定.在HotSpot中,每次创建具有非平凡的finalize()方法的对象时,将通过调用Finalizer.register方法创建Finalizer的实例.

这可能意味着比分配两个对象而不是一个对象要多得多.这些Finalizer实例将是强连接的,这对于防止收集Finalizer实例本身是必要的,并且它们具有对构造对象的引用.换句话说,无论最初的对象分配如何本地化,新对象都将逃脱,阻碍了大量后续优化.

当涉及到“破坏”时,回收普通物体就是无操作.不会采取任何操作,事实上,无法对无法访问的对象执行任何操作,因为它无法访问.只有具有可访问的Reference对象(如上面提到的Finalizer对象)才能遇到特殊的可达性状态,该对象保存对特定对象的引用(而对象不是通过任何其他普通引用遇到的.然后,Reference对象可以是排队,之后(其中一个)终结者线程可以采取适当的行动.

当然,将“无动作”与任何其他动作进行比较可能会导致任意因素.绝对数量为2,400ns,这对于涉及将对象排队并通知另一个线程轮询队列的操作是合理的.

标签:java-memory-model,java,garbage-collection,finalization
来源: https://codeday.me/bug/20190929/1833631.html