应该关闭Class.getResourceAsStream吗?

Bob*_*law 33 java

我想知道这是否是必需的,因为当我使用此方法时,正在从类路径中读取文件."不关闭"会导致内存泄漏.

我该如何测试这种内存泄漏?

jwa*_*ins 27

您假设Class.getResourceAsStream()将始终返回指向类'JAR文件中的文件的流.这是不正确的.您的类路径也可能包含文件夹,在这种情况下Class.getResourceAsStream()将返回一个FileInputStream.其他一些类加载器也可能返回其他类型的资源,例如远程文件(在URLClassLoader的情况下).

即使在JAR文件的情况下,实现也可能通过任何方式将JAR文件中的持久视图维护到您正在访问的文件的压缩字节.也许它持有内存映射ByteBuffer...

为什么要冒这个机会?你应该总是关闭流(以及其他任何Closeable,实际上),无论它们是如何给你的.

至于检测泄漏,最好的策略是在VM关闭时获取内存转储,然后使用某个工具进行分析.两个流行的工具是jhatEclipse mat.


Att*_*ila 7

根据经验,您应该关闭所有流(以及其他提供近距离功能的类型).它可能导致ro资源泄漏(内存是一种资源).

虽然有自动垃圾收集最终在不再引用对象时回收内存,但它仍可能保留可能未释放的本机资源.此外,如果某个其他长期存在的对象(例如类加载器)保留资源,则垃圾收集器不会声明它.

如果您的程序是短暂的,或者您只打开少量资源,则可能不会遇到问题,但在长时间运行的应用程序中很难检测到资源泄漏.


And*_*rea 5

返回的类型是一个输入流,因此,不管具体的实现(可能因版本而异),您都有应调用imho的close()方法。

不管该方法实际上是否在当前版本中做一些有用的事情。