加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:13:09 所属栏目:Java 来源:网络整理
导读:Java没有对象的生命周期,这是由垃圾收集器管理的.如果我使用一些IO类而不关闭它,或者某些DBConnection,这会被认为是资源泄漏吗?换句话说,IO对象将被垃圾收集器AFAIK收集和销毁,垃圾收集器仅用于内存.例如: BufferedReader br = new BufferedReader( new Fi
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读