这主要是出于好奇。
如果除了调试/记录/分析目的以外,有人遇到过Object.finalize()的任何好用法,我还在徘徊吗?
如果你没有遇到任何你认为好用的东西?
答案 0 :(得分:8)
如果您的Java对象使用JNI指示本机代码分配本机内存,则需要使用finalize来确保它被释放。
答案 1 :(得分:6)
来到这里的派对很晚,但我想我仍然会说:
我为终结器找到的最好的用途之一是调用显式终止方法,出于某种原因,这些方法没有被调用。发生这种情况时,我们也会记录该问题,因为它是一个BUG!
由于:
这只留下了一些他们可以解决的任务而没有太大的风险。
答案 2 :(得分:3)
但它只是一种后备使用的是“正常”机制不起作用。应明确启动正常机制。
答案 3 :(得分:3)
释放应在正常情况下手动释放但由于某种原因未发布的资源。也许写一个警告日志。
答案 4 :(得分:2)
当使用软引用来缓存数据库支持的对象时,我用它将数据写回数据库。
答案 5 :(得分:-1)
我看到finalize()的一个很好的用途:释放大量可用的资源而不是独占的。
例如,默认情况下,Linux进程可以使用1024个文件句柄,Windows可以使用大约10000个文件句柄。这几乎是,所以对于大多数应用程序,如果你打开一个文件,你不必调用.close()(并使用丑陋的尝试...最后块),你会没事的 - 终于()将一段时间之后为你释放它。但是对于某些代码片段(如密集型服务器应用程序),使用.close()释放资源是必须的,否则finally()可能会为您调用太晚,并且您可能会用完文件句柄。
Swing使用相同的技术 - 用于显示窗口的操作系统资源和绘图不是由任何.close()方法释放的,而是由finalize()释放,因此您不必担心所有.close ()或.dispose()方法,例如在SWT中。
但是,如果资源数量非常有限,或者您必须“锁定”资源才能使用它,请记住“解锁”它。例如,如果您在文件上创建文件锁,请记住也要删除此锁,否则其他任何人都无法读取或写入此文件,这可能导致死锁 - 然后您不能依赖finalize()来删除这个锁给你 - 你必须在正确的地方手动完成。