1. 程式人生 > >【Java】finalize()和垃圾回收機制

【Java】finalize()和垃圾回收機制

finalize()方法:一旦gc準備釋放物件佔用的儲存空間,將首先呼叫finalize()方法,並在下一次垃圾回收動作發生時才會真正回收記憶體。可在此進行重要的清理操作。gc只能釋放那些經由new分配的記憶體,對其他形式獲得的記憶體無法釋放。finalize()方法不一定會被呼叫,所以不能作為通用的清理方法。

它不是解構函式,C++中物件一定會被銷燬(必須用到解構函式),而java 物件卻並非總是被垃圾回收。所以:

(1)。物件可能不被垃圾回收。

(2)。垃圾回收並不等於“析構”。

(3)。垃圾回收只與記憶體有關。

垃圾回收機制處理new出來的物件,finalize()處理其他方式為物件分配的儲存空間,比如“本地方法”,是一種在Java中呼叫非Java程式碼的方式,分配記憶體時採用了類似C的方法。

finalize()方法用來發現物件中更沒有被適當清理的部分。

class Book{
    boolean checkOut = false;

    public Book(boolean checkOut) {
        this.checkOut = checkOut;
    }

    void checkIn(){
        checkOut = false;
    }
    protected void finalize() throws Throwable {
        if (checkOut){
            System.out
.println("Error:checked out"); super.finalize(); } } public static void terminationCondition(){ Book novel = new Book(true); novel.checkIn();//正常回收 new Book(true); System.gc();//強制進行終結動作 }
    //執行結果:
    //Error:checked out
    //finalize()用來驗證終結條件:所有Book物件被回收前都應被簽入(check in)
}

垃圾回收器只有在程式儲存空間快用完時才會呼叫。否則程式退出後資源自動交付作業系統。可以用System.gc()通知系統回收,但是不一定立即執行。