前言:

java语言中由于有垃圾回收机制,因此大大解放了程序员的工作量,不再需要担心自己忘记释放不用的内存而导致内存泄露这样尴尬的事情了,当我们高呼gc万岁的时候,还是会发现在很多场景需要我们做一些手动close,或recycler。下面就这个问题进行总结。

1.有gc为什么还需要手动释放资源?

1)gc只能释放内存资源,而不能释放与内存无关资源。

2)gc回收具有不确定性,你根本不知道它什么时候会回收,而对于需要程序员手动回收的资源往往具有这样的特点:资源开销大,不用需要立即释放;或者资源是系统唯一的,不释放会导致别的程序也无法使用该资源。那对于具有这些特点的资源就必须保证不使用后能够立即释放出这部分资源,而不能把这件事情交给一个具有不确定性的gc来完成。

3)有人可能会说java IO流资源虽然不能被gc直接释放,但可以利用finalizer机制来释放非java资源,事实上java也确实在IO流的一些类中这么做了,如下:

/** * 该段代码摘自FileInputStream源码,jdk版本1.8 */

protected void finalize() throws IOException {

if ((fd != null) && (fd != FileDescriptor.in)) {

/* if fd is shared, the references in FileDescriptor * will ensure that finalizer is only called when * safe to do so. All references using the fd have * become unreachable. We can call close() */

close();

}

}

但是请注意,这仅仅是api程序员的严谨,防止由于我们这些程序员的大意忘记手动close资源,这依旧不是我们不手动调用close方法释放资源的借口。因为第一finalize的执行时机是在gc前,而gc具有时间不确定性,所以finalize执行时间也不具有确定性,对于需要及时回收的资源finalize无法保证及时。第二,finalize不是析构函数,jvm也根本就不能保证finalize一定会执行,那么就更不能依赖finalizer机制释放资源了。

2.需手动释放的常见资源

1)java IO流资源

2)jdbc资源(Connection,PrepareStatement,ResultSet)

3)android中的bitmap资源

3.资源关闭顺序问题

单个资源关闭往往没什么可说的,直接关闭即可,但在java很多类体系中往往存在依赖关系和资源装饰关系,这个时候就有关闭先后问题,否则还会引发异常

1)先开后关原则(燃气灶原则,恕我取了一个这么难听的名字)

这个原则很像生活中的一件事情,那就是使用燃气灶。使用燃气灶的时候我们都是先开气阀,再打开燃气灶的开关,做晚饭我们则先关闭燃气灶开关,最后再关上气阀。(电脑主机和显示器的开关顺序也满足这个原则,开机先开显示器后开主机,关机先关主机后关显示器,别问我为什么,问你们微机老师去)

jdbc资源的开关顺序如下:

先打开Connection资源,再打开PrepareStatement资源,最后打开ResultSet资源。使用完毕后先调用ResultSet的close方法,再调用PrepareStatement的close方法,最后调用Connection的close方法。

java IO流资源的开关顺序如下:

我们一般先打开一个输入流进行读取操作,然后将读取的数据写入输出流中,关闭时按照上面的原则,则应该先关输出流,然后关闭输入流。但是,我们发现在java io流关闭操作中,即使顺序反了也不会出现异常。因为我们关闭流的时机是在读写完成之后,并且输出流和输入流一般用一个中间buff数组做数据传递关联,并不像jdbc中资源之间的强依赖关联,所以即使关闭一个,另一个并不受影响。

2)由外到内原则(洋葱原则,又一个难听的名字,%>_

如果资源存在包装嵌套关系,则先关闭外层,后关闭内层的。

java io流中,处理流装饰节点流,我们应该先关闭装饰流,再关闭节点流。原则上是这样,但是我们发现这样反而会出现程序异常,因为java api上已经帮我们做了这样的事情。就是在处理流的close方法中调用了节点流的close方法。因此对java io流资源,如果是处理流,我们只需要调用处理流的close方法即可

java在退出前释放资源_【java】手动释放资源问题相关推荐

  1. java在退出前释放资源,【java】手动释放资源问题

    前言: java语言中因为有垃圾回收机制,所以大大解放了程序员的工做量,再也不须要担忧本身忘记释放不用的内存而致使内存泄露这样尴尬的事情了,当咱们高呼gc万岁的时候,仍是会发如今不少场景须要咱们作一些 ...

  2. java对数字的处理_[java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  3. java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发

    [Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...

  4. java类全路径简写_[JAVA] JAVA 类路径

    Java 类路径 类路径是所有包含类文件的路径的集合. 类路径中的目录和归档文件是搜寻类的起始点. 虚拟机搜寻类 搜寻jre/lib和jre/lib/ext目录中归档文件中所存放的系统类文件 搜寻再从 ...

  5. java在退出前释放资源_Java中如何通过try优雅地释放资源?

    1. 背景 其实,在JDK 7就已经引入了对 try-with-resources 的支持,它的主要作用就是解放小明和小明小伙伴们的双手,帮助我们自动释放使用过的资源(比如输入.输出流). 2. 例子 ...

  6. java程序退出自动保存_你知道如何自动保存 Spring Boot 应用进程号吗

    1. 前言 欢迎阅读 Spring Boot 2 实战 系列文章. PID 对于系统运维来说并不陌生,但是对于一些开发者特别是新手还是要简单介绍一下的.它是 Process ID 的简称,是系统分配给 ...

  7. java实型常量用十六进制表示_[Java入门笔记] Java语言基础(二):常量、变量与数据类型...

    常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...

  8. java excel 操作 jar包_[JAVA]使用POI向Excel中写入数据以及如何在Intellj IDEA中打jar包...

    freddon 发表于2018-05-30 阅读 1383 | 评论 0 给GF写的,现在记录下POI操作Excel读写过程;以及如何在Intellj IDEA中打jar包 代码如下: ``` imp ...

  9. java输入日期计算天数_(JAVA)输入年月日,计算日期是今年的第几天?

    展开全部 import java.util.Scanner; /** * Created by xpf on 2018/6/22 :) * GitHub:xinpengfei520 * Functio ...

  10. java怎么往右浮动_[Java教程]jQuery实现页面滚动时智能浮动定位

    [Java教程]jQuery实现页面滚动时智能浮动定位 0 2016-08-04 18:00:08 jQuery实现页面滚动时层智能浮动定位_前端开发 * { margin: 0; padding: ...

最新文章

  1. 微服务化后,这几点一定要注意
  2. 转:JAVA常见错误处理方法 和 JVM内存结构
  3. python图像腐蚀处理_[Python图像处理]八.图像腐蚀和图像膨胀
  4. TFS2008 基本安装
  5. hanlp中的N最短路径分词
  6. 4位16色灰度图像处理
  7. linux 进程开始与终止
  8. java 免费cms_开源 免费 java CMS
  9. JQuery Datatables 样式Style
  10. 在 Windows 8 中支持传感器
  11. shmget出现Invalid argument错误
  12. 控制层远程调用业务层_如何应用数据访问服务层分离系统中的业务层和持久层之间耦合关系...
  13. 《Android 面试指南》来自腾讯、阿里巴巴、欢聚时代、美团、聚美优品、悦跑圈等大佬分享的面经...
  14. python降维方法_python大战机器学习——数据降维
  15. 中兴设备交换机路由器清除清理指定接口计数的统计信息命令
  16. carsim/trucksim获取轮胎侧偏刚度、纵向刚度
  17. 四川农业大学计算机考研调剂,四川农业大学调剂基本条件
  18. 怎么理解“不经审视的人生,不值得过!“
  19. 51nod 1128 正整数分组 V2(二分数组)
  20. 概率论与数理统计--笔记

热门文章

  1. 台式计算机的电流是多少,电脑台式机一天耗电大概是多少
  2. Flurry、友盟、TalkingData,Google analytic移动应用统计分析对比
  3. android刮刮乐游戏布局,Android实现 刮刮乐效果
  4. Java响应式编程基础-响应式流
  5. html dwt怎样制作,将HTML文件制作成ecshop的dwt模板(二)建立公共类库1
  6. Elastic:开发者上手指南
  7. 使用console配置线连接真机路由器
  8. 解决Java应用的后台错误:“操作符不存在: character varying = bytea“
  9. CryEngine5 Shader调试
  10. Unity 多端游戏画面同步