黑马程序员技术交流社区

标题: 有了垃圾回收机制为什么还要调用close方法进行关闭 [打印本页]

作者: TK13761    时间: 2013-3-22 07:59
标题: 有了垃圾回收机制为什么还要调用close方法进行关闭
本帖最后由 谭仁龙 于 2013-3-22 09:37 编辑

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

作者: 刘国涛    时间: 2013-3-22 08:11
一个对象在没有被引用变量指向的时候它会变成垃圾,最终会被垃圾回收器从内存中清除。
但创建一个IO流对象的时候,同时系统也会创建一个叫做流的东西,因此,计算机内存中实际产生了两个事物,一个是java程序中类的实例对象,一个是系统本身产生的某种资源,而垃圾回收器只能管理程序中类的实例对象,没办法去管理系统产生的资源,所以程序需要调用close方法进行关闭。
作者: 张文星    时间: 2013-3-22 08:43
首先,显示的关闭打开的流是一个良好的习惯,其次,垃圾回收机制不是万能的,一样也可能出现内存泄露的问题,而且,关闭输出流可以保证操作系统将缓冲区的内容写到它的目的地。
作者: qintoko    时间: 2013-3-22 09:11
如果你写过C或者C++就知道,系统的内存资源是十分有限的,变量的调用要尽量以节约资源,减少系统,提高速度为目的。当你明知道一个引用已经调用玩了,就应该关闭,而不是占用系统的资源,等待他自动关闭
作者: scott0610    时间: 2013-3-22 09:16
Java语言提供的垃圾回收机制主要是对堆内存中的资源进行管理和回收。
垃圾回收:当程序创建对象,数组等应用类型实体时,系统都会在堆内存中为之分配一块内存空间,对象就保存在这块内存空间里,当这块内存不再被任何引用变量引用时,这块内存空间就变成了垃圾,等待垃圾回收机制进行回收。
特点:
(1)垃圾回收机制只负责回收堆内存中对象,不会回收任何物理资源(比如数据库连接,网络IO等资源)
(2)程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久性地失去引用后,系统就会在适合的时候回收它所占的内存。
(3)垃圾回收机制回收任何对象之前,总会先调用它的finalize方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。

希望对你有所帮助,加油哦
作者: 江公亮    时间: 2013-3-22 10:06
袁见 发表于 2013-3-22 09:16
Java语言提供的垃圾回收机制主要是对堆内存中的资源进行管理和回收。
垃圾回收:当程序创建对象,数组等应用 ...

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

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

可不可以指向还未初始化了的,已经定义了的对象,是不是等到指向的对象销毁了,它才能销毁




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