黑马程序员技术交流社区

标题: 有关资源关闭的疑问 [打印本页]

作者: 孙浩    时间: 2012-6-25 09:47
标题: 有关资源关闭的疑问
本帖最后由 孙浩 于 2012-6-25 10:23 编辑

一个对象在没有引用变量指向它时会变成垃圾,最终会被垃圾回收器从内存清除。那我们创建的流对象,为何还要:调用close()将它关闭,释放其资源呢?
作者: 韦念欣    时间: 2012-6-25 10:00
本帖最后由 韦念欣 于 2012-6-25 10:05 编辑

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


作者: 黑马—陈磊    时间: 2012-6-25 10:07
本帖最后由 黑马—陈磊 于 2012-6-25 10:12 编辑

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2