gpt4 book ai didi

java - 为什么不能在 Closeable 类上自动调用 close()?

转载 作者:行者123 更新时间:2023-11-29 07:54:42 24 4
gpt4 key购买 nike

我不明白。例如我们在代码中有一个 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();
}

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

参见 documentation了解更多详情。

最后,对于 为什么Closable 和首先需要显式关闭的东西,这是针对 JVM 不直接管理的资源和因此也不能被 GC 自动回收。这些资源例如文件、套接字或音频输出。

关于java - 为什么不能在 Closeable 类上自动调用 close()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18670658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com