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

Chr*_*ssy 8 java resources garbage-collection finalize

如果你是幸运一些类实现AutoClosable但有时你必须要小心,检查现有的方法要注意有一个close,destroy或shutdown方法(或什么都笔者决定将它命名).

这是Java中资源泄漏的主要来源.

我和一位同事正在讨论这个问题,并且也想知道:为什么这不能以某种方式自动化?

从理论上讲,您可以使用finalize这种情况,但不建议这样做.那么为什么没有办法只使用其中一些可关闭的资源并让GC在实例不再可用时自动关闭它们而不必记住明确地写一些close处理代码(比如try ...)?

这是因为在GC启动之前系统可能资源不足(文件描述符,...)?

注意:我尽可能使用autoclose并使用FindBugs(+ FB contrib)检查我的代码是否存在内存泄漏,但我仍然想知道......

同样感兴趣(如答案中所讨论的):最终确定的弃用.

And*_*ner 2

为什么这不能以某种方式自动化?

因为,一般来说,一个类可以做任何事情:编译器没有简单的方法来知道某些东西是“打开”的,因此应该“关闭”的,因为Java没有强大的值所有权概念。

即使您有一个需要关闭的类型的字段,您也不能轻易保证它不会从 getter 返回,例如返回到负责关闭它的其他东西。

指示类的实例需要关闭的唯一真正一致的方法是通过实现接口AutoCloseable(或Closeable,或扩展它的其他接口)。如果您正在使用这些,IDE 可能能够提供有关泄漏资源的警告;但这些都将在尽最大努力的基础上进行。