天天看點

Java中終結處理和垃圾回收(finalize方法介紹)

       作為Java的初學者,我單純地認為類的初始化很重要,而類的清理工作不重要,因為Java為我們提供了強大的垃圾回收機制。但是最近我發現,把一個對象用完後就“棄之不顧”的做法并非總是安全的,當你的對象(并非使用new)獲得一塊“特殊”的記憶體區域,由于垃圾回收機制隻知道釋放那些經由new配置設定的記憶體,是以它不知道如何釋放該對象的這塊“特殊”記憶體。為了應對這種情況,Java的Object類中的finalize()就發揮了作用。它的工作原理如下:一旦垃圾回收器準備好釋放對象所占用的存儲空間,将首先調用其finalize()方法,并且在下一次垃圾回收動作發生時,才能真正收回對象所占用的記憶體。

        這裡有一個程式設計陷阱,有些程式員會finalize()方法當做C++中的析構函數。是以這裡有必要說明一下:在C++ 中,對象一定會被銷毀;而Java中對象卻并非總是被收回。

      Java的垃圾回收機制有三個要點需要記住:

      1、對象可能不被垃圾回收;

      2、垃圾回收并不等于“析構”;

      3、垃圾回收隻與記憶體有關。

在Java程式中,隻要沒有瀕臨存儲空間用完的那一刻,對象所占用的空間總是得不到釋放。如果程式結束,那些資源就會歸還給作業系統。Java語言這樣做還是合适的,因為垃圾回收本身也有開銷,要是不使用它,那麼就不用支付這部分開銷。

文章最後,我需要說一下在finalize()方法中處理的特殊情況,如果我們在對象中使用“本地方法”(使用JNI技術)擷取記憶體,那麼我們需要在finalize()釋放所申請的記憶體,否則将會發生記憶體洩露的情況。