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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谭仁龙 于 2013-3-22 09:37 编辑

RT 今天往回复习IO流发现了这个问题  有了垃圾回收机制为什么还要调用close方法进行关闭 求指点

评分

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

查看全部评分

7 个回复

倒序浏览
一个对象在没有被引用变量指向的时候它会变成垃圾,最终会被垃圾回收器从内存中清除。
但创建一个IO流对象的时候,同时系统也会创建一个叫做流的东西,因此,计算机内存中实际产生了两个事物,一个是java程序中类的实例对象,一个是系统本身产生的某种资源,而垃圾回收器只能管理程序中类的实例对象,没办法去管理系统产生的资源,所以程序需要调用close方法进行关闭。

点评

谢谢  发表于 2013-3-22 09:36

评分

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

查看全部评分

回复 使用道具 举报
首先,显示的关闭打开的流是一个良好的习惯,其次,垃圾回收机制不是万能的,一样也可能出现内存泄露的问题,而且,关闭输出流可以保证操作系统将缓冲区的内容写到它的目的地。

点评

谢谢  发表于 2013-3-22 09:36

评分

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

查看全部评分

回复 使用道具 举报
如果你写过C或者C++就知道,系统的内存资源是十分有限的,变量的调用要尽量以节约资源,减少系统,提高速度为目的。当你明知道一个引用已经调用玩了,就应该关闭,而不是占用系统的资源,等待他自动关闭

点评

谢谢  发表于 2013-3-22 09:36

评分

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

查看全部评分

回复 使用道具 举报
Java语言提供的垃圾回收机制主要是对堆内存中的资源进行管理和回收。
垃圾回收:当程序创建对象,数组等应用类型实体时,系统都会在堆内存中为之分配一块内存空间,对象就保存在这块内存空间里,当这块内存不再被任何引用变量引用时,这块内存空间就变成了垃圾,等待垃圾回收机制进行回收。
特点:
(1)垃圾回收机制只负责回收堆内存中对象,不会回收任何物理资源(比如数据库连接,网络IO等资源)
(2)程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久性地失去引用后,系统就会在适合的时候回收它所占的内存。
(3)垃圾回收机制回收任何对象之前,总会先调用它的finalize方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。

希望对你有所帮助,加油哦

点评

谢谢  发表于 2013-3-22 09:37

评分

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

查看全部评分

回复 使用道具 举报
袁见 发表于 2013-3-22 09:16
Java语言提供的垃圾回收机制主要是对堆内存中的资源进行管理和回收。
垃圾回收:当程序创建对象,数组等应用 ...

对第三点有点模糊,对象调用finalize方法后,该对象会终结,处于待回收队列中,等待垃圾回收机来清理,
那处于队列中的对象,会产生对其他对象的引用吗,怎么产生的呢?
回复 使用道具 举报
江公亮 发表于 2013-3-22 10:06
对第三点有点模糊,对象调用finalize方法后,该对象会终结,处于待回收队列中,等待垃圾回收机来清理,
...

如果你在finalize方法中重新定义一个引用变量来指向队列中准备终结的对象时,垃圾回收机制就不会回收该对象。
回复 使用道具 举报
袁见 发表于 2013-3-22 11:41
如果你在finalize方法中重新定义一个引用变量来指向队列中准备终结的对象时,垃圾回收机制就不会回收该对 ...

可不可以指向还未初始化了的,已经定义了的对象,是不是等到指向的对象销毁了,它才能销毁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马