当前位置: 首页 > 知识库问答 >
问题:

为什么在Java中重写finalize()方法?[副本]

安坚诚
2023-03-14

当我们不知道任何给定对象的finalize()方法何时可以运行时,我们需要在java中重写finalize()方法的哪里?我们可以在finalize()中关闭什么类型的资源?GC调用finalize()方法的最佳机会是什么?

共有1个答案

彭修筠
2023-03-14

首先,终结的目的是在无法访问的对象被回收垃圾之前,给该对象执行任何清理的机会。
例如,关闭一个打开的数据库连接。

对于对象,应该重写finailze()方法,以便包括清理代码或处理在对象被垃圾回收之前应该完成的系统资源。

关于GC调用finalize()方法的最佳机会是什么,我们可以通过两种方式请求JVM执行垃圾收集:

  1. runtime.getruntime().gc();
  2. system.gc();

我们可以在finalize()中关闭哪种类型的资源,答案是在两种情况下:

 类似资料:
  • 我对在我想要克隆对象的类中重写克隆方法感到困惑。 因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求? 另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样? 欢迎提供所有答案。

  • 问题内容: 我需要知道何时在中调用该方法。我创建了一个测试类,该法通过覆盖该方法来在调用该方法时将其写入文件。它不执行。谁能告诉我它为什么不执行的原因? 问题答案: 通常,最好不要依赖进行任何清理等工作。 根据Javadoc(值得阅读),它是: 当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。 正如Joachim指出的那样,如果对象始终是可访问的,则在程序生命中可能永远不会发生这种

  • 问题内容: 我正在努力了解为什么在Java中 需要方法重载和重写 ? 我已经阅读了一些与此相关的文章,但无法理解为什么实际上需要它? 我还访问了以下url,但在该主题中我还不清楚。 Java重载和覆盖 任何实际的例子将不胜感激。 提前致谢。 问题答案: 来自doc的 方法重载: 假设您有一个可以使用书法绘制各种类型的数据(字符串,整数等)的类,并且包含一个用于绘制每种数据类型的方法。为每个方法使用

  • 输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。

  • 问题内容: (此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。) 为什么在Java 9中不推荐使用该方法? 是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(虽然仅一次)或尝试关闭其中的某些本机资源(总比不完全关闭要好))以及许多其他方法可能会被错误地使用。 那么,是真的如此危险或绝对没有用,有必要将其逐出Jav

  • 问题内容: 我听说在Joshua Bloch的书中写道,如果我们重写finalize方法,则分配和内存收集可能会增加到430次。 对我来说很明显,内存收集的工作可能会变慢,因为gc需要进行额外的迭代才能释放内存。 但是为什么可以增加分配阶段? 问题答案: 我已经搜索了原始语句: 在我的机器上,创建和销毁简单对象的时间约为5.6 ns。添加终结器会将时间增加到2,400 ns。换句话说,使用终结器创