1. 清理資源(Java提供的 默認機制:finalize()方法)
2. 垃圾回收機制回收某個對象所佔用的內存
先執行1,再執行2.系統將會嚴格按照這個次序來。
只有當程序認爲需要更多的額外內存時,垃圾回收機制纔會進行垃圾回收。所以可能出現這樣的一種情形:
當某個對象沒有引用再指向他的時候,他只佔用了少量的內存,而系統也沒有嚴重的內存需求,垃圾回收機制就沒有試圖去回收該對象所佔用的資源,所以該對象的finalize方法也不會得到調用。
示例:
class FinalizeTest{
private static FinalizeTest ft=null;
public void info(){
System.out.println("測試清理資源的finalize方法");
}
public void finalize(){
ft=this;
}
public static void main(String[] args) {
new FinalizeTest();
//通知系統進行垃圾回收
Runtime.getRuntime().gc();//1
//等價於System.gc();
Runtime.getRuntime().runFinalization();//2
//等價於System.runFinalization();
ft.info();
}
}
只有1,沒有2:空指針異常。雖然你強制垃圾回收機制(只是一種建議)進行回收,但是JVM可能並不是馬上就去調用可恢復對象的finalize方法,所以ft可能爲null。
只有2,沒有1:空指針異常。由於沒有通知垃圾回收機制進行垃圾回收,如果程序內存不緊張,那麼系統通常是更不可能立即進行垃圾回收,也就更不可能會去調用FinalizeTest對象的finalize()方法,所以ft也就是爲null。