【Java】finalize()和垃圾回收機制
阿新 • • 發佈:2019-02-15
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()通知系統回收,但是不一定立即執行。