黑马程序员技术交流社区

标题: IO流资源的处理问题 [打印本页]

作者: 黑马张健    时间: 2012-5-21 23:12
标题: IO流资源的处理问题
java中有了垃圾回收机制,为什么还要用close方法去关闭流资源对象呢?
作者: 林翔    时间: 2012-5-21 23:21
这是两个不同的概念,因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。

作者: 于潇    时间: 2012-5-21 23:21
所谓垃圾回收的,主要是内存。
如果一个程序结束了,进程就消失了。那么分给这个进程的内存也就释放了。
但是如果进程不结束,程序就会一直运行着,程序会动态的分配内存空间。
如果动态分配的内存空间不能得以回收,那么进程可用的内存空间就会越来越少。
垃圾回收机制就是负责清理对象,回收内存的。

也就是说不close(),进程就存在,程序就不会被当成垃圾,自然无法回收
作者: 古银平    时间: 2012-5-21 23:21
因为流资源对象不单在内存中分配了空间,也在操作系统占有了资源,java的垃圾回收机制是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知操作系统来释放这个资源且java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。
作者: 冯越    时间: 2012-5-21 23:34
首先,你要明确一点垃圾回收和close方法时两个完全不同的概念。
1.java中垃圾回收机制的作用是:一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。
该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。 但是,并不是对象被抛弃后当即被回收的。至于他是什么时候被收回的这不需要我们去关心。
总之,他不会造成你内存的泄露。
2.io流它所调用的是你底层的资源,是你系统的东西,是你告诉了jvm给我分配一个输入或输出流,我需要使用了。他不是一种对象,所以当你不需要这个资源的时候,你当然要把他关闭了,不然jvm会一直保持这个输入和输出流。会造成资源的浪费。




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