2

我不明白。例如,我们在代码中有一个 OutputStream 类型的变量,我们应该在停止使用它时调用 close() ,这就是为什么它没有以这种方式实现的原因:GC 在清理时调用 close() 本身这个变量?

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

4

1 回答 1

9

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

此外,从 Java 7 开始,您实际上可以这样做:

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

并将close在 try 块结束时自动调用。

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

最后,关于为什么需要Closable明确关闭的原因,这是针对不由 JVM 直接管理的资源,因此也不能由 GC 自动回收。此类资源用于文件、套接字或音频输出的实例。

于 2013-09-07T07:01:17.680 回答