因為剛從.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,或者是不做任何操作,只會將對象相關的堆內存由垃圾回收器回收掉,物理資源仍然存在,直到程序退出。