繁体   English   中英

为什么close()无法自动在Closeable类上调用?

[英]Why close() cannot be called on Closeable classes automatically?

我不明白 例如,我们在代码中有一个OutputStream类型的变量,当我们停止使用它时,应该在其上调用close(),这也说明了为什么它不是以这种方式实现的:当GC对它进行清理时,它会调用close()本身。这个变量?

更新:好的,到目前为止,我得出的结论是:释放非托管资源不仅是释放内存,更重要的是我们现在不在内部释放行为,这可能会限制此资源的数量(连接数/处理程序),这就是为什么我们需要尽快释放它们。 我对吗? 因为如果所有内容都与内存有关,那么我不知道为什么GC无法像托管资源那样完成这项工作。

在大多数情况下, close最终会由GC通过finalize方法自动调用(任何类都可以具有销毁对象时由GC调用的finalize ;对于拥有资源的Closable类型,通常将其实现为调用close )。 当然,问题在于您只是无法控制何时发生(如果有的话)。 从您停止使用该对象而仍然用尽分配的资源开始,可能需要10秒或10分钟。 因此,一旦不再需要清理资源句柄,这是一种很好的样式。

另外,由于Java 7,您实际上可以执行以下操作:

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

并且try块的末尾将自动调用close

有关更多详细信息,请参见文档

最后,对于为什么存在Closable以及首先需要显式关闭的事物,这是针对那些不是由JVM直接管理的资源,因此也不能由GC自动回收。 此类资源用于实例文件,套接字或音频输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM