java - 为什么 Java 中的一些资源没有被垃圾回收,必须关闭或自动关闭?

标签 java garbage-collection resources finalize

如果幸运的话,其中一些类会实现 AutoClosable但有时你只需要小心并检查现有的方法,就会注意到有一个 closedestroyshutdown 方法(或任何其他方法)作者决定给它命名)。

这是 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/

相关文章:

c# - 弱引用和非弱引用字典

c# - 垃圾收集器和循环引用

c++ - 如何将内存块的指针转换为标准流

java - 滚动条 JTextarea 不工作

java - 在构造函数和方法中调用 thread.start() 方法有什么区别

Java: boolean 值+整数

java - 为具有通用类型的多个 WSDL 优化 WSImport

python - 明确关闭文件重要吗?

c++ - 是否有用于 Windows 资源加载字符串的有用 C++ 包装器类?

WPF - 为每个带有样式的 TreeViewItem 根节点设置不同的 ToggleButton 图像