finalize方法

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章