【发布时间】:2018-07-31 01:55:12
【问题描述】:
如果你很幸运,其中一些类实现了AutoClosable,但有时你只需要小心并检查现有方法即可注意到有一个close、destroy 或shutdown 方法(或任何其他方法)作者决定命名)。
这是 Java 中资源泄漏的主要来源。
我正在和一位同事讨论这个问题,也想知道:为什么不能以某种方式自动化?
理论上你可以在这种情况下使用finalize,但它是not recommended。那么为什么没有办法只使用其中一些可关闭的资源并让 GC 在实例不再可访问时自动关闭它们,而不必记住显式编写一些 close 处理代码(如 try ...)?
这是因为在 GC 启动之前系统可能已经资源匮乏(文件描述符,...)吗?
注意:我尽可能使用自动关闭,并使用 FindBugs (+ FB contrib) 检查我的代码是否存在内存泄漏,但我仍然想知道......
也感兴趣(如答案中所述):deprecation of finalize。
【问题讨论】:
-
主要是因为如果 GC 只需要释放巨大的合并内存块,它可以是愚蠢而快速的。这些资源需要运行代码来进行发布。
-
关闭可能要执行一些额外的任务,想想关闭网络连接。这涉及延迟。您永远不希望有任何事情来延迟垃圾收集。这就是为什么任何关闭机制都不属于 GC 循环的原因。
-
@Lou Franco 所以你的意思是它通常会产生停顿和不可预测的性能?
-
“当实例不再可访问时让 GC 自动关闭它们”确实如此。例如,FileOutputStreams 在 GC 时关闭。您不能依赖于在任何特定时间发生这种情况。
标签: java garbage-collection resources finalize