我不明白。例如,我们在代码中有一个OutputStream类型的变量,当我们停止使用它时,我们应该在它上面调用close(),以及为什么它没有以这种方式实现:GC在它清理时调用close()本身这个变量?
更新 好的我到目前为止已经得出结论:释放非托管资源不仅仅是释放内存更重要的是我们现在没有内部行为,它可能存在对此资源数量的限制(连接数/处理程序数)这就是我们需要尽快释放它们的原因。我对吗?因为如果它完全是关于内存的,那么我不知道为什么GC不能像管理资源那样完成工作。
答案 0 :(得分:5)
close
最终会由GC通过finalize
方法自动调用(任何类都可以有这样的finalize
,在销毁对象时由GC调用;对于保存资源的Closable
类型通常会被实现以调用close
)。问题当然是你无法控制何时发生这种情况(如果有的话)。从您停止需要该对象开始,它可能是10秒或10分钟,仍然耗尽分配的任何资源。因此,一旦您不再需要资源句柄,清理资源句柄是一种很好的方式。
此外,从Java 7开始,您实际上可以这样做:
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
并且会在try块结束时自动调用close
。
有关详细信息,请参阅documentation。
最后,对于为什么存在Closable
以及首先需要显式关闭的事情,这适用于不是由JVM直接管理的资源,因此也可以GC不会自动回收。这些资源用于实例文件,套接字或音频输出。