【发布时间】:2011-05-12 00:50:18
【问题描述】:
这主要是出于好奇。
除了调试/日志记录/分析目的之外,是否有人遇到过 Object.finalize() 的任何好的用法?
如果你还没有遇到过,你会说什么是好的用法?
【问题讨论】:
-
您可以将其用作门挡或船锚:-)
-
:D 你的意思是它够重还是它不会漂浮?
标签: java finalizer object-destruction
这主要是出于好奇。
除了调试/日志记录/分析目的之外,是否有人遇到过 Object.finalize() 的任何好的用法?
如果你还没有遇到过,你会说什么是好的用法?
【问题讨论】:
标签: java finalizer object-destruction
如果您的 Java 对象使用 JNI 来指示本机代码分配本机内存,则需要使用 finalize 以确保它被释放。
【讨论】:
dispose() 或 close() 来进行清理。
close他们,但是一些本机内存可能没有问题,所以我们可以用Java的方式处理。
finalize() 是“Java 方式”,而不是使用“尝试资源”或手动调用close()?
在这里聚会迟到了,但我想我还是会插话的:
我发现终结器的最佳用途之一是调用显式终止方法,无论出于何种原因,这些方法都没有被调用。发生这种情况时,我们也会记录问题,因为它是一个 BUG!
因为:
这只会留下他们可以在没有太大风险的情况下解决的少数任务。
【讨论】:
但这只是一个后备,使用的是“正常”机制并没有工作。正常机制应显式启动。
【讨论】:
释放正常情况下应该手动释放,但由于某种原因没有释放的资源。可能会在日志中写入警告。
【讨论】:
在使用软引用缓存数据库支持的对象时,我使用它将数据写回数据库。
【讨论】:
我发现 finalize() 有一个很好的用途:释放大量可用且非独占的资源。
例如,默认情况下,Linux 进程有 1024 个文件句柄可用,Windows 大约有 10000 个。这差不多,所以对于大多数应用程序,如果你打开一个文件,你不必调用 .close() (并使用丑陋的 try...finally 块),你会没事的 - finally() 会一段时间后为您免费。但是对于某些代码片段(如密集的服务器应用程序),必须使用 .close() 释放资源,否则 finally() 可能调用得太晚,您可能会用完文件句柄。
Swing 使用相同的技术 - 用于显示窗口和绘图的操作系统资源不会由任何 .close() 方法释放,而只是由 finalize() 释放,因此您不必担心所有 .close () 或 .dispose() 方法,例如 SWT 中的方法。
但是,当资源数量非常有限,或者您必须“锁定”资源才能使用它时,也要记得“解锁”它。例如,如果您在文件上创建文件锁,请记住还要删除此锁,否则其他人将无法读取或写入此文件,这可能导致死锁 - 然后您不能依赖 finalize() 删除这个锁是给你的——你必须在正确的地方手动操作。
【讨论】:
close() 如此容易时,应用程序依赖终结器关闭文件句柄是无礼的高度。
dispose() 并且仅 调用dispose() 时释放与AWT/Swing 窗口关联的本机资源。只要一个窗口没有被显式释放,它就可以通过Window.getWindows() 访问,并且不会被垃圾回收。所以它的finalize() 方法不会被调用,即使它有一个终结器。此外,FileDescriptor 的终结器将关闭句柄,但不会刷新任何缓冲区。因此,不关闭文件相关资源可能会导致数据丢失。