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
Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?
我在webapp(hibernate-core-4.3.8。Final和Spring 3.2.11。RELEASE)上使用Spring和hibernate。我使用hikaricp(v 2.2.5)作为连接池impl,它检测连接泄漏并打印下面的stacktrac。我使用Spring的声明性事务划分,因此我假设资源的管理和清理是由Spring/hibernate完成的。因此,我认为Spring或hib
在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?
我是个新手。我已经编写了这段代码,它显示那里存在资源泄漏 这是什么意思?抱歉,我太天真了。