因为刚从.net转到java,所以首先了解一下java的垃圾回收机制,java的close跟.NET的dispose是一样一样的。.NET存在托管资源和非托管资源之分,java也是同样,只不过java没有这两个名词。托管的资源不需要开发者理会,垃圾回收器会自动回收,而非托管资源则需要开发者手动回收。
为什么呢,因为有些资源如数据库连接,io等等不仅仅包含对象所占内存,还包含一些物理资源(具体什么叫物理资源,还请知道的人以io为例介绍一下,鄙人不才对这些底层的东西不了解),而物理资源的释放是虚拟机无能为力的。手动调用close就是为了释放这些物理资源,而不是释放这个对象所占的内存。以下面代码为例,调用reader的close会把物理资源释放掉而与对象所占内存并无直接关系,可能有些非托管资源的close方法中恰好将对象置为了null。
FileReader reader=new FileReader("E:\\1.txt");
reader.read();
reader.close();
if(null==reader){
System.out.println("kong");
}else{
System.out.println("fei kong");//输出结果是:fei kong
}
也就是说,需要手动释放的资源分为两部分。堆内存和物理资源,堆内存还是由垃圾回收器负责回收,物理资源则需要手动释放。如果将reader手动置为null,或者是不做任何操作,只会将对象相关的堆内存由垃圾回收器回收掉,物理资源仍然存在,直到程序退出。