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

zou*_*yjs 4 java garbage-collection resource-leak

Java没有对象的生命周期,这是由garbage collector.如果我使用某些IO类而不关闭它,或者某些IO类DBConnection,这会被认为是资源泄漏吗?换句话说,IO对象将被垃圾收集器AFAIK收集和销毁,垃圾收集器仅用于内存.例如:

BufferedReader br = new BufferedReader( new FileReader( new File("path") ) );
Run Code Online (Sandbox Code Playgroud)

Ama*_*mar 6

是的,你是对的.

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

但是许多类如FileInputStreamRandomAccessFile使用finalize()方法编写,它确保IF收集垃圾中的实例,close()将首先被调用.因此,在许多情况下,垃圾收集会间接释放文件,并且程序员通常可能会懒得关闭资源,因为垃圾收集通常会为您清理它们.不幸.

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

像这样的错误通常难以可靠地重现,因为它们取决于垃圾收集器的时间.所以你得到的东西通常很好,但有时会神秘失败.非常讨厌调试.因此,强烈建议您在完成后立即关闭()任何流/读取器/连接或您可能正在使用的其他可关闭资源.优选地,在最终块中,即使在处理中发生一些其他错误,也要确保它发生.

使用Java 7,还有一个AutoClosable接口,在这里阅读更多相关内容.

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

  • @zoujyjs使用"finalize"只会产生额外的GC开销.关闭应该通过try..catch..finally来完成.但是如果无法保证,您可能想要使用finalize. (2认同)
  • 添加到上面 Sajal 的输入中,基本上你不应该依赖任何其他东西,并在完成后显式关闭你的流/连接。 (2认同)