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