16

这主要是出于好奇。

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

如果您还没有遇到任何问题,您会说什么是好的用法?

4

6 回答 6

10

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

于 2010-11-18T13:14:20.893 回答
6

在这里聚会迟到了,但我想我还是会插话:

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

因为:

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

这只留下了他们可以在没有太大风险的情况下解决的少数任务。

于 2011-01-03T21:11:21.403 回答
3
  1. 关闭外部连接(数据库、套接字等)
  2. 关闭打开的文件。甚至可能会尝试写一些额外的信息。
  3. 日志记录
  4. 如果此类运行应该仅在对象存在时才存在的外部进程,则可以尝试在此处杀死它们。

但这只是一个后备,使用的是“正常”机制并没有工作。正常机制应明确启动。

于 2010-11-18T13:34:14.043 回答
3

释放正常情况下应该手动释放,但由于某种原因没有释放的资源。也许在日志中写入警告。

于 2010-11-18T13:44:45.683 回答
2

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

于 2010-11-18T13:16:42.557 回答
-1

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

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

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

但是,当资源数量非常有限,或者您必须“锁定”资源才能使用它时,也要记得“解锁”它。例如,如果您在文件上创建文件锁,请记住还要删除此锁,否则其他人将无法读取或写入此文件,这可能导致死锁 - 然后您不能依赖 finalize() 删除这个锁适合您 - 您必须在正确的位置手动操作。

于 2010-11-18T16:11:58.930 回答