1. 程式人生 > >java回收finalize方法的作用(編程思想)

java回收finalize方法的作用(編程思想)

過程 支付 情況 () 存儲 als 它的 才會 垃圾回收

清理:終結處理和垃圾回收
java有垃圾回收期負責回收無用對象占據的內存資源。但也有這種情況:假定你的對象(並非使用new)獲得了一塊“特殊”的內存區域,由於垃圾回收期只知道釋放那些由new分配的內存,所有它不知道該如何釋放對象這塊“特殊內存”。為了應對這種情況,Java允許在類中定義一個名為finalize()的方法。它的工作原理“假定”是這樣的:
一旦垃圾回收期準備好釋放對象占用的存儲空間,將首先調用其finalize()方法,並且在下一次垃圾回收動作發生時,才會真正回收對象占用的內存。所以要是你打算用finalize(),就能在垃圾回收時刻做一些重要的清理工作。
例子模擬:
假設某個對象在創建過程中會自己繪制到屏幕上,如果不是明確的從屏幕上將其擦除,它可能永遠得不到清理。如果在finalize()裏加入某種擦除功能,當“垃圾回收”發生時(不能保證一定會發生),finalize()方法得到了調用,圖像就會被擦除,下一次垃圾回收就會回收掉。
也許你會發現,只要程序沒有瀕臨存儲空間用完的那一刻,對象占用的空間就總得不到釋放。如果程序執行結束,並且垃圾回收器一直沒有釋放你創建的任何對象的存儲空間,則隨著程序的退出,那些資源也會全部交還給操作系統。這個策略是恰當的,因為垃圾回收本身也有開銷,要是不使用它,也就不用支付這部分開銷了。

finalize使用例子:驗證終結條件
public class TestFinalize {
public static void main(String[] args){
Book novel = new Book(true);
novel.checkIn();
//Drop the reference. forget to clean up
new Book(true);
//Force garbage collection & finalization
System.gc();
}
}
class Book{
boolean checkOut = false;
Book(boolean checkOut){
this.checkOut = checkOut;
}
void checkIn(){
checkOut = false;
}
protected void finalize(){
if(checkOut){
System.out.println("Error: checked out");
}
}
}

java回收finalize方法的作用(編程思想)