当前位置: 首页 > 面试题库 >

将流类或连接视为Java中的资源泄漏

樊琦
2023-03-14
问题内容

Java没有对象的生存期,这由进行管理garbage collector。而且,如果我使用某些IO类而不关闭它,或者使用某些IO类DBConnection,这是否会导致资源泄漏?换句话说,将由垃圾收集器AFAIK收集并销毁IO对象,垃圾收集器仅用于内存。例如:

BufferedReader br = new BufferedReader( new FileReader( new File("path") ) );

问题答案:

是的,你是对的。

垃圾回收会释放Java堆(内存),但是close()会释放用于打开文件的OS资源(在大多数系统上打开文件的数量受到限制),并确保真正写入数据

但是许多类(例如FileInputStream和)RandomAccessFile都使用finalize()方法编写,该方法可以确保如果垃圾中的实例被调用,则将首先调用close()。因此,在许多情况下,垃圾回收确实会间接释放文件,并且程序员经常可能会懒于关闭资源,因为垃圾回收通常会为您清理文件。不幸。

问题在于您无法控制何时发生,而且可能根本不会发生。因此,如果打开的文件太多,则操作系统可能会在垃圾收集器关闭它们之前给您一个有关此错误的信息。或者,如果您要移动或删除文件,请在读取文件后立即进行-
移动或删除可能会失败,因为此时您仍可以打开文件进行读取。

这样的错误通常很难可靠地重现,因为它们取决于垃圾收集器的时间。因此,您得到的东西通常可以正常工作,但有时会失败。非常烦人的调试。出于这个原因,强烈建议确保在完成操作后立即关闭您可能正在使用的任何流/读取器/连接或其他可关闭资源。最好在finally块中,以确保即使在处理过程中发生其他错误也能确保它发生。

在Java
7中,还增加了一个AutoClosable接口,请在此处阅读有关它的更多信息。

参考:http : //www.coderanch.com/t/278165//java/InputStream-close-garbage-
collection



 类似资料: