将流类或连接视为Java中的资源泄漏
Java没有对象的生命周期,这是由垃圾收集器管理的.如果我使用一些IO类而不关闭它,或者某些DBConnection,这会被认为是资源泄漏吗?换句话说,IO对象将被垃圾收集器AFAIK收集和销毁,垃圾收集器仅用于内存.例如:
BufferedReader br = new BufferedReader( new FileReader( new File("path") ) ); 解决方法
是的,你是对的.
垃圾收集释放Java堆(内存)但close()释放用于打开文件的OS资源(打开文件的数量在大多数系统上是有限的)并确保数据是真正写入的. 但是许多类(如FileInputStream和RandomAccessFile)都是使用finalize()方法编写的,该方法确保IF收集垃圾中的实例,close()将首先被调用.因此,在许多情况下,垃圾收集会间接释放文件,并且程序员通常可能会因关闭资源而懒惰,因为垃圾收集通常会为您清理它们.不幸. 问题在于你无法控制何时发生这种情况,而且可能根本不会发生.因此,如果您打开了太多文件,操作系统可能会在垃圾收集器关闭它们之前给您一个错误.或者,如果您想要移动文件或删除文件,请在阅读后立即删除 – 移动或删除可能会失败,因为此时您仍然可以打开文件进行阅读. 像这样的错误通常难以可靠地重现,因为它们取决于垃圾收集器的时间.所以你得到的东西通常很好,但有时会神秘失败.非常讨厌调试.因此,强烈建议您在完成后立即关闭()任何流/读取器/连接或您可能正在使用的其他可关闭资源.优选地,在最终块中,即使在处理中发生一些其他错误,也要确保它发生. 使用Java 7,还增加了AutoClosable接口,了解更多关于它的信息here. 参考:http://www.coderanch.com/t/278165//java/InputStream-close-garbage-collection (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |