finalize()方法的良好用途

时间:2010-11-18 13:13:24

标签: java finalizer object-destruction

这主要是出于好奇。

如果除了调试/记录/分析目的以外,有人遇到过Object.finalize()的任何好用法,我还在徘徊吗?

如果你没有遇到任何你认为好用的东西?

6 个答案:

答案 0 :(得分:8)

如果您的Java对象使用JNI指示本机代码分配本机内存,则需要使用finalize来确保它被释放。

答案 1 :(得分:6)

来到这里的派对很晚,但我想我仍然会说:

我为终结器找到的最好的用途之一是调用显式终止方法,出于某种原因,这些方法没有被调用。发生这种情况时,我们也会记录该问题,因为它是一个BUG!

由于:

  • 根据语言规范,无法保证终结器会立即执行(或技术上完全执行)
  • 执行在很大程度上取决于JVM实现
  • 如果GC具有较低的线程优先级,则有时会延迟执行

这只留下了一些他们可以解决的任务而没有太大的风险。

答案 2 :(得分:3)

  1. 关闭外部连接(db,socket等)
  2. 关闭打开的文件。甚至可能会尝试写一些额外的信息。
  3. 登录
  4. 如果此类运行仅在对象存在时应存在的外部进程,则可以尝试在此处终止它们。
  5. 但它只是一种后备使用的是“正常”机制不起作用。应明确启动正常机制。

答案 3 :(得分:3)

释放应在正常情况下手动释放但由于某种原因未发布的资源。也许写一个警告日志。

答案 4 :(得分:2)

当使用软引用来缓存数据库支持的对象时,我用它将数据写回数据库。

答案 5 :(得分:-1)

我看到finalize()的一个很好的用途:释放大量可用的资源而不是独占的。

例如,默认情况下,Linux进程可以使用1024个文件句柄,Windows可以使用大约10000个文件句柄。这几乎是,所以对于大多数应用程序,如果你打开一个文件,你不必调用.close()(并使用丑陋的尝试...最后块),你会没事的 - 终于()将一段时间之后为你释放它。但是对于某些代码片段(如密集型服务器应用程序),使用.close()释放资源是必须的,否则finally()可能会为您调用太晚,并且您可能会用完文件句柄。

Swing使用相同的技术 - 用于显示窗口的操作系统资源和绘图不是由任何.close()方法释放的,而是由finalize()释放,因此您不必担心所有.close ()或.dispose()方法,例如在SWT中。

但是,如果资源数量非常有限,或者您必须“锁定”资源才能使用它,请记住“解锁”它。例如,如果您在文件上创建文件锁,请记住也要删除此锁,否则其他任何人都无法读取或写入此文件,这可能导致死锁 - 然后您不能依赖finalize()来删除这个锁给你 - 你必须在正确的地方手动完成。