在 Java 中完成的目的是什么?

2022-09-05 00:31:39

我对最终确定的理解是这样的:

为了清理或回收对象占用的内存,垃圾回收器将生效。(自动调用?

然后,垃圾回收器取消引用该对象。有时,垃圾回收器无法访问该对象。然后调用 finalize 以执行最终清理处理,之后可以调用垃圾回收器。

这是对最终确定的准确描述吗?


答案 1

垃圾回收器在后台自动工作(虽然可以显式调用,但需要这样做应该很少)。它基本上只清理其他对象未引用的对象(当然,全貌更复杂,但这是基本思想)。因此,它不会更改任何活动对象中的任何引用。如果无法从任何活动对象访问某个对象,这意味着可以安全地对其进行垃圾回收。

稿是为了清理对象获取的资源(不是内存,而是其他资源,例如文件句柄、端口、数据库连接等)。但是,它并没有真正解决:-(

  • 它是不可预测的,何时将被调用finalize()
  • 事实上,不能保证会永远被调用!finalize()

因此,即使它被保证被调用,它也不是释放资源的好地方:当它被调用以释放您打开的所有数据库连接时,系统可能已经完全耗尽了可用连接,并且您的应用程序不再工作。


答案 2

本文中

实现 finalize() 方法的任何类实例通常称为可最终确定对象。当它们不再被引用时,Java 垃圾回收器不会立即回收它们。相反,Java 垃圾回收器会将对象追加到一个特殊队列中以用于完成过程。通常,它由某些 Java 虚拟机上称为“引用处理程序”的特殊线程执行。在此终结过程中,“终结器”线程将执行对象的每个finezize()方法。只有在finize()方法成功完成后,才会将对象移交给Java垃圾回收,以便“未来”垃圾回收回收其空间。

您可以自由地在类的finformize()方法中执行几乎任何事情。当您这样做时,请不要期望每个对象占用的内存空间在不再被引用或不再需要时被Java垃圾回收器回收。为什么?不能保证 finalize() 方法会及时完成执行。最坏的情况是,即使不再引用该对象,它甚至可能不被调用。这意味着不能保证任何具有finize()方法的对象都被垃圾回收。

此外,Sun的这篇文章有一些很好的图表来解释这个过程。


推荐