【发布时间】:2017-12-12 10:09:24
【问题描述】:
在某处我读到没有必要自己关闭它,只需离开它,JVM 会帮你做到这一点。这是真的吗?
假设我需要从文件中获取数据
Source.fromFile(fileName).getLines()
直接,没有
val source = Source.fromFile(fileName)
val lines = source.getLines()
............
source.close()
在第一种方式中,我无法直接访问源并关闭它。我的 JVM 工作了很长时间。我需要关闭一个文件(需要关闭未使用的资源)。
如果有人可以在这里留下一些链接或解释,那就太好了。
【问题讨论】:
-
“在某处我读到没有必要自己关闭它,就离开它”不,这就是存在显式关闭方法和 try-with-resources 的原因。
-
@saifahmad - 不正确。它们将最终被 GC 收集......在它们变得无法访问之后。问题是“最终”。如果你依赖 GC 来关闭文件,那么在 GC 有机会清理你的烂摊子之前,你的应用程序很可能会用完 文件描述符。
-
@Stephen C 但是 JVM 足够智能,可以检测到文件描述符将被填充。而 GC 将启动。但我同意让文件指针悬空是一种不好的做法。
-
@saifahmad - 我很确定如果文件描述符用完,GC 不会被触发。 (而且我只是看了一下 OpenJDK Java 8 源代码……)