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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张豪杰 中级黑马   /  2013-2-26 11:46  /  1859 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张豪杰 于 2013-2-26 17:53 编辑

java中的垃圾回收机制,不是不断释放不再被程序引用的对象么?
为什么还要用close方法去关闭流资源对象呢?

评分

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

查看全部评分

4 个回复

倒序浏览
因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。

评分

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

查看全部评分

回复 使用道具 举报
我们在程序中创建的对象都是对应现实世界中有形或无形的事物,计算机操作系统所产生的东西当然也是现实世界中的事物,
也就是说,程序中的对象也可以对应计算机操作系统所产生的一个其他东西,专业地说,这些东西叫资源,流就是操作系统产生的一种资源。

当我们在程序中创建了一个IO流对象,同时系统内也会创建了一个叫流的东西,在这种情况下,计算机内存中实际上产生了两个事物,一个是Java程序中的类的实例对象,一个是系统本身产生的某种资源。
Java垃圾回收器只能管理程序中的类的实例对象,没法去管理系统产生的资源,所以程序需要调用close方法,去通知系统释放其自身产生的资源。

评分

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

查看全部评分

回复 使用道具 举报
首先你得先明白垃圾回收的含义:具体来说回收机制就是 当一些资源被创建使用之后或不在调用的话 就会变成垃圾,垃圾的话会占用空间,这时候就需要释放空间给其他程序使用,所以JAVA拥有自动垃圾回收机制,会在适当的时候自动调用垃圾回收 释放资源,程序员也可以手动调用释放资源等等。
如:public class A
{
String str;public A(String str)
{       
this.str=str;
}       
public String toString()
{               
return str;       
}       
@Override        protected void finalize() throws Throwable
{               
System.out.println("我是"+str+".我被回收了..");       
}       
public static void main(String[] args)
{               
A a=new A("李四");               
a=null;               
System.gc();   //运行结果 我是李四.我被回收了..       
}
}
对于为什么还要用close方法去关闭流资源对象呢 原因很简单因为:
流不单在内存中分配了空间,也在操作系统占有了资源,java的GC是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。

评分

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

查看全部评分

回复 使用道具 举报
为什么要自己close呢?因为java的垃圾回收机制是很懒的,除非垃圾满天飞,不然它不出来,而且垃圾回收机制非常耗资源,当它出来系统也会"卡"
java回收机制是不定时不定期出现的,close是必须的
java是无法直接访问本地文件的,
比如要访问本地txt文件
java先跟本地系统打个招乎,在调用本地的如:记事本这类程序访问txt文件
用完close是必须的,有借有还再借不难{:soso_e113:}
close的都是本地资源
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马