A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-zhangping 中级黑马   /  2012-11-3 15:04  /  1678 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中有垃圾回收机制,为什么还要用close()对其进行一些释放资源的操作呢,两者有什么区别?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

4 个回复

倒序浏览
java的垃圾回收器只会释放掉那些java对象所占的内存。无法释放数据库api创建的资源。
close方法就是用来施放那些资源的。如果你没有每个都close,会导致内存泄漏

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
垃圾回收是回收内存中不再使用的对象,释放那部分内存
close()关闭资源,是关闭CPU资源,不关闭,会继续占用CPU,也就是占用资源,所以要关闭

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴愿涛 于 2012-11-3 16:29 编辑

close()方法释放的是正在占用的资源,而不是持有资源的对象;
java垃圾回收机制(GC)回收的是对象,表现为回收对象分配的内存;但不能回收资源,如果不执行close,可能会造成资源耗尽。
也可以这么理解,jvm回收的是由java创建的对象占用的内存资源,但是有close()方法的java内置对象(比如:套接字对象,数据库连接对象)这些实际都占用了计算机的其他资源,所以实际释放的是计算机其他资源,而非java创建的对象占用的内存资源。所以close()方法是必须的。(比如使用了数据库的连接对象,如果不调用close()方法将会导致数据库的连接资源耗尽)

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
close方法释放的是系统资源,例如对流进行操作时,对某一个文件进行读或写时,完成后需要用close方法,关闭正在使用的系统资源。
而对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马