最近在项目中,代码质量整改时做的,full gc扫描,回收不用的资源文件。总结了一下和jdk版本有关
- 版本是jdk1.6 (如果有多个,最先创建的最后关,最后创建的最先关)
在 JDK 7 之前,你一定要牢记在 finally 中执行 close 以释放资源
https://blog.csdn.net/guxianyang/article/details/78304142
原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭。
InputStream in = null;
try {
in = acquireStream();
...
} finally {
if (in != null) in.close();
}
在上述代码中,流的关闭是放在try中的,但是我们都知道流资源的关闭尽量要放在finally块中,因为如果try中代码执行失败,流没有被正确关闭就造成资源浪费。
首先关闭资源放在try块里一定会有问题:资源可能不被关闭。
所以资源的关闭应该放在finally里,这没有什么疑问。
至于finally块里close资源会额外引入IOE,这也是无法避免的。
目前(就我见到过的)绝大多数代码里,捕获IOE后,最多打一条log,更多的是noop,即no operations,do nothing。
close的时候IOE发生的几率很小,它应该属于一种操作系统层面的error,选择忽略它是正确的选择,毕竟你的系统不能因为一个资源关闭错误而停止运行。况且,如果你硬要捕获这个IOE,那能做些什么呢
2.版本是jdk 1.7
JDK 7 中的 try-with-resources 介绍
try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。
https://www.cnblogs.com/hk-zsg/p/11557431.html
代码:
例如,我们自定义一个资源类
public class Demo {
public static void main(String[] args) {
try(Resource res = new Resource()) { // try
res.doSome();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
class Resource implements AutoCloseable { // 实现接口AutoCloseable
void doSome() {
System.out.println("do something");
}
@Override
public void close() throws Exception {
System.out.println("resource is closed");
}
}
执行输出如下:
do something
resource is closed
步骤1定义接口实现AutoCloseable接口
步骤2,把资源放在try里面
3 try-with-resources 在 JDK 9 中的改进