jwa*_*ins 27
您假设Class.getResourceAsStream()将始终返回指向类'JAR文件中的文件的流.这是不正确的.您的类路径也可能包含文件夹,在这种情况下Class.getResourceAsStream()将返回一个FileInputStream.其他一些类加载器也可能返回其他类型的资源,例如远程文件(在URLClassLoader的情况下).
即使在JAR文件的情况下,实现也可能通过任何方式将JAR文件中的持久视图维护到您正在访问的文件的压缩字节.也许它持有内存映射ByteBuffer...
为什么要冒这个机会?你应该总是关闭流(以及其他任何Closeable,实际上),无论它们是如何给你的.
至于检测泄漏,最好的策略是在VM关闭时获取内存转储,然后使用某个工具进行分析.两个流行的工具是jhat和Eclipse mat.
根据经验,您应该关闭所有流(以及其他提供近距离功能的类型).它可能导致ro资源泄漏(内存是一种资源).
虽然有自动垃圾收集最终在不再引用对象时回收内存,但它仍可能保留可能未释放的本机资源.此外,如果某个其他长期存在的对象(例如类加载器)保留资源,则垃圾收集器不会声明它.
如果您的程序是短暂的,或者您只打开少量资源,则可能不会遇到问题,但在长时间运行的应用程序中很难检测到资源泄漏.
| 归档时间: |
|
| 查看次数: |
10549 次 |
| 最近记录: |