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)
是的,你是对的.
垃圾收集释放Java堆(内存)但close()释放用于打开文件的OS资源(打开文件的数量在大多数系统上是有限的)并确保数据是真正写入的.
但是许多类如FileInputStream和RandomAccessFile使用finalize()方法编写,它确保IF收集垃圾中的实例,close()将首先被调用.因此,在许多情况下,垃圾收集会间接释放文件,并且程序员通常可能会懒得关闭资源,因为垃圾收集通常会为您清理它们.不幸.
问题在于你无法控制何时发生这种情况,而且可能根本不会发生.因此,如果您打开了太多文件,操作系统可能会在垃圾收集器关闭它们之前给您一个错误.或者,如果您想要移动文件或删除文件,请在阅读后立即删除 - 移动或删除可能会失败,因为此时您仍然可以打开文件进行阅读.
像这样的错误通常难以可靠地重现,因为它们取决于垃圾收集器的时间.所以你得到的东西通常很好,但有时会神秘失败.非常讨厌调试.因此,强烈建议您在完成后立即关闭()任何流/读取器/连接或您可能正在使用的其他可关闭资源.优选地,在最终块中,即使在处理中发生一些其他错误,也要确保它发生.
使用Java 7,还有一个AutoClosable接口,在这里阅读更多相关内容.
参考:http://www.coderanch.com/t/278165//java/InputStream-close-garbage-collection
| 归档时间: |
|
| 查看次数: |
5035 次 |
| 最近记录: |