如果幸运的话,其中一些类会实现 AutoClosable但有时你只需要小心并检查现有的方法,就会注意到有一个 close
、destroy
或 shutdown
方法(或任何其他方法)作者决定给它命名)。
这是 Java 中资源泄漏的主要来源。
我和一位同事讨论过这个问题,我也想知道:为什么这不能以某种方式自动化?
理论上你可以对这种情况使用finalize
,但它是not recommended .那么为什么没有办法只使用其中一些可关闭的资源并让 GC 在实例不再可用时自动关闭它们而不必记住明确编写一些 close
处理代码(如 try .. .) ?
这是因为在 GC 启动之前系统可能资源匮乏(文件描述符,...)?
注意:我尽可能使用自动关闭并使用 FindBugs(+ FB contrib)检查我的代码是否存在内存泄漏,但我仍然想知道......
也很感兴趣(如答案中所述):deprecation of finalize .
最佳答案
垃圾收集器的唯一工作是收集不再使用的内存。添加关闭资源将对垃圾收集器的性能产生负面影响,目前由垃圾收集器调用的 Finalizer
线程完成,以便允许实现在收集之前清除资源。值得注意的是,此机制被声明为 deprecated
因为它从一开始就不是解决此类问题的最佳解决方案,但目前可以实现您的类以在它们运行之前清理它们自己将被收集。
Finalizer
(或 Java 9 中的新机制)可能会被扩展以检查要收集的类是否实现了 AutoClosable
(Java 1.7 添加的接口(interface),因此无论如何它都不是那么旧)并在 finalize
之外调用它。这将产生与您建议的效果类似的效果,而无需更改垃圾收集器的行为和角色。也许这已经发生了(我自己还没有测试过)。
关于java - 为什么 Java 中的一些资源没有被垃圾回收,必须关闭或自动关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48889746/