建议始终关闭程序中的流,以防止严重的资源泄漏。但是资源泄漏实际上是如何发生的呢?任何代码示例将不胜感激。谢谢。
考虑一下:
File[] lotsAndLotsOfFiles = ...
for (File f: lotsAndLotsOfFiles) {
InputStream is = new FileInputStream(f);
// Use `is` ... But don't close it
}
上述情况发生的情况是,您最终会打开大量文件。在后台,每个打开的文件都有一个关联的文件描述符。例如,在 Linux 上,操作系统只允许进程在任何给定时间具有有限数量的文件描述符。如果进程已用完其文件描述符配额,则进一步尝试打开文件将失败。
在Java级别,垃圾回收器(GC(将完成任何它发现为垃圾的OutputStream
、InputStream
、Reader
或Writer
。终结器将调用close()
这将释放文件描述符。但问题是垃圾回收器只是偶尔运行。因此,如果在连续的 GC 运行之间泄漏了太多文件描述符,您的应用程序将耗尽,并可能死亡。
防止 Java 资源泄漏的正确方法示例。