我想知道是否需要这样做,因为当我使用此方法时,文件是从类路径中读取的。“不关闭”是否会导致内存泄漏。
我如何测试这种内存泄漏?
您假设这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关闭时获取内存转储,然后使用某种工具进行分析。两种流行的工具是jhat和Eclipse mat。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句