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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙浩 中级黑马   /  2012-6-25 09:47  /  1916 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙浩 于 2012-6-25 10:23 编辑

一个对象在没有引用变量指向它时会变成垃圾,最终会被垃圾回收器从内存清除。那我们创建的流对象,为何还要:调用close()将它关闭,释放其资源呢?

3 个回复

倒序浏览
本帖最后由 韦念欣 于 2012-6-25 10:05 编辑

对于流、socket等之类的资源是系统资源,当你使用流后,系统将分配给你资源,如果你不close释放掉这个资源,JAVA就认为这个资源是活跃的,会一直占用这个资源,就会影响其他程序使用了,直到你的进程结束,所有使用的资源才自动释放。
对于java的垃圾回收,主要是对内存的回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收。
所以如果你用完了流,不释放的话,将会影响其他程序的使用。
当然,如果你确保这个资源只有一个程序在使用,也可以不close,但是这样不是一个好的编程习惯。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马—陈磊 于 2012-6-25 10:12 编辑

close释放的是资源,而不是持有资源的对象,java可以自动回收的是对象,表现为回收对象分配的内存,但不能回收资源,如果不执行close,可能会造成资源耗尽。

java中的垃圾回收机制的作用是:当程序在运行的过程中,我们因为可能会产生许多的不再需要的变量,或者对象等等,我们称之为垃圾,如果程序很大,并且它在运行时不断地产生垃圾,那么早晚这些垃圾会把虚拟机所分配的最大内存空间给占用完了。我们的程序也就停止了运行。
io流它调用的是底层资源是你系统的东西,是你告诉了jvm给我分配一个输入或输出流,我需要使用了。当你不再需要这个底层资源的时候,java回收机制不能将它回收的,因为它不属于jvm所能操纵的,我们说io流是你告诉系统开启的,当你不需要使用的时候,自然要让jvm告诉系统我不需要了,你把它关了吧。跟垃圾的回收机制没有沾边。它不是jvm运行时产生的垃圾。而是系统分配的资源,用的时候我就给你,不用的时候你就得告诉我,我就给你关了。这是一种跟底层交互的机制。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢两位的答案
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马