Finalize 與 GC

預備知識

  • Java的Gc只負責內存的清理,其它方面的清理要程序員手工操作
  • 調用Gc并不能保證Gc一定會執(zhí)行,因為GC的線程優(yōu)先級比較低,所以在測試的時候調用完GC一般使當前線程睡眠以便GC線程的執(zhí)行。
  • 用戶自己調用finalize函數并不會影響到清理徽鼎,和調用一個正常的方法一樣,沒有什么特別的影響
  • jvm保證一個對象占用的內存回收之前弹惦,如果這個對象的類實現(xiàn)了finalize方法否淤,一定會執(zhí)行且僅執(zhí)行一次,至于如何保證的會在下面講到
  • 對象的finalize鏈需要手工構造棠隐,也就是如果重寫finalize函數需要手動調用super.finalize()

對象的銷毀過程

沒有重寫finalize方法

  • 剛創(chuàng)建的對象狀態(tài)是reachable石抡,如果對象變成不可達,GC會直接將對象銷毀

重寫了finalize方法

  • 剛創(chuàng)建:reachable + unfinalized狀態(tài)助泽,意思是:該對象可達啰扛,而且該對象的finalize函數還沒有被調用,并且沒有準備被調用嗡贺,因為該對象可達GC不會試圖去銷毀該對象隐解。
  • 對象的引用沒有了,現(xiàn)在是不可達狀態(tài)暑刃,但是因為其重寫了finalize函數厢漩,所以jvm會將該對象放到F-queue中,該隊列中的對象狀態(tài)都變成:F-reachable + finalizable岩臣,意思是:該對象通過F-queue可達而且準備被調用finalize函數。
  • 在任何時候宵膨,如果F-queue隊列非空架谎,GC的一個線程都會從該隊列中取出一個對象,將其狀態(tài)標記為:unreachable + finablized辟躏,并執(zhí)行它的finalize函數谷扣, 意思是:該對象現(xiàn)在不可達,而且已經執(zhí)行過finalize函數,不能再次被放到F-queue隊列中会涎,也就保證了finalize只會被執(zhí)行一次裹匙。
  • 如果F-queue中的一個對象在其finalize函數中“復活了自己”---將自己的引用又賦值給了一個變量,這個時候這個對象就再次變成了reachable末秃,但是他的finalize函數仍然不會被再次執(zhí)行概页,也就是說它現(xiàn)在的狀態(tài)類似于一個沒有覆蓋finalize函數的對象,如果再次變得不可達练慕,會直接被GC銷毀惰匙。
  • 下面演示一個對象在finalize函數中復活自己的例子:
public class Main{
    static Main HOOK;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize function is called");
        HOOK=this;
    }

    public static void main(String[] args) throws InterruptedException {
        HOOK = new Main();
        HOOK=null;
        System.gc();
        Thread.sleep(3000);
        if(HOOK==null){
            System.out.println("object is dead");
        }else {
            System.out.println("object is alive");
        }

        HOOK=null;
        System.gc();
        Thread.sleep(3000);
        if(HOOK==null){
            System.out.println("object is dead");
        }else {
            System.out.println("object is alive");
        }
    }
}
  • output:
finalize function is called
object is alive
object is dead
  • GC第一次執(zhí)行的時候,調用了finalize函數铃将,通過將this引用賦值給另一個變量项鬼,將對象復活,所以對象仍然是存活的劲阎,但是第二次就不會在調用finalize函數绘盟,所以對象被銷毀。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末悯仙,一起剝皮案震驚了整個濱河市奥此,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁比,老刑警劉巖稚虎,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偎捎,居然都是意外死亡蠢终,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門茴她,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻拂,“玉大人,你說我怎么就攤上這事丈牢〖蓝ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵己沛,是天一觀的道長慌核。 經常有香客問我,道長申尼,這世上最難降的妖魔是什么垮卓? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮师幕,結果婚禮上粟按,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好灭将,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布疼鸟。 她就那樣靜靜地躺著,像睡著了一般庙曙。 火紅的嫁衣襯著肌膚如雪空镜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天矾利,我揣著相機與錄音姑裂,去河邊找鬼。 笑死男旗,一個胖子當著我的面吹牛舶斧,可吹牛的內容都是我干的。 我是一名探鬼主播察皇,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茴厉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了什荣?” 一聲冷哼從身側響起矾缓,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稻爬,沒想到半個月后嗜闻,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡桅锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年琉雳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片友瘤。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翠肘,死狀恐怖,靈堂內的尸體忽然破棺而出辫秧,到底是詐尸還是另有隱情束倍,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布盟戏,位于F島的核電站绪妹,受9級特大地震影響,放射性物質發(fā)生泄漏抓半。R本人自食惡果不足惜喂急,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笛求。 院中可真熱鬧,春花似錦、人聲如沸探入。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜂嗽。三九已至苗膝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間植旧,已是汗流浹背辱揭。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留病附,地道東北人问窃。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像完沪,于是被迫代替她去往敵國和親域庇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 原文閱讀 前言 這段時間懈怠了覆积,罪過听皿! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊宽档,這博客我...
    碼農戲碼閱讀 5,970評論 2 31
  • 1. Java基礎部分 基礎部分的順序:基本語法尉姨,類相關的語法,內部類的語法吗冤,繼承相關的語法又厉,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 通過這篇文章你能知道的問題: 1.如何判斷對象是活著還是死去欣孤? 2.在Java語言中馋没,可作為GCRoots的對象有...
    beneke閱讀 1,353評論 0 1
  • 一個優(yōu)秀的Java程序員必須了解GC的工作原理、如何優(yōu)化GC的性能降传、如何與GC進行有限的交互篷朵,因為有一些應用程序對...
    開心跳蚤閱讀 1,051評論 0 2
  • 你沉默不語声旺,可見回憶依稀倒帶。 曾經的歡笑與無味爭吵隨時光流逝段只, 恰似晨光里飄飛的塵埃腮猖,如破曉前瘋了的狂歡。 短暫...
    朽戀閱讀 313評論 1 1