应该关闭Class.getResourceAsStream吗?

BobLoblaw:

我想知道是否需要这样做,因为当我使用此方法时,文件是从类路径中读取的。“不关闭”是否会导致内存泄漏。

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

jwatkins:

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

即使在JAR文件的情况下,实现也有可能以某种方式维护JAR文件内部对要访问的文件的压缩字节的持久性视图。也许它正在保留映射的内存ByteBuffer...

为什么要抓住机会?无论将流如何分配给您,您都应始终关闭流(以及实际上其他任何Closeable)。

请注意,从Java 7开始,处理关闭任何资源的首选方法肯定是try-with-resources构造。它可以正确处理一些很难处理手写代码的极端情况,但是对于您来说,编写该过程几乎就像您只是忘记关闭资源一样容易。例如,您可以使用如下代码:

    try (InputStream in = Class.getResourceAsStream("someresource.txt")) {
        // Use the stream as you need to...
    }

    // Then forget about it... and yet, it has been closed properly.

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章