finalize 與 Java GC

閑逛ITEye時(shí)看到了譯帝的一篇翻譯博客,其中提到了關(guān)于Java類重寫finalize方法后帶來的詭異的GC overhead limit問題黎休。博客的結(jié)尾非常詳細(xì)的說明了這個(gè)問題產(chǎn)生的原理米者,但是始終有一個(gè)地方?jīng)]有得到清晰的答案:由于finalize方法是Object類的protected方法花颗,即無論重寫與否大刊,所有的Java類都會(huì)帶有finalize方法淀弹,但為什么只有重寫之后才會(huì)出現(xiàn)GC問題夫壁,不重寫與重寫的真實(shí)差別到底在哪兒拾枣?

通過思考始終得不到答案,索性打開Eclipse直接調(diào)試代碼:

首先驗(yàn)證了博客中的現(xiàn)象的確可以重現(xiàn)掌唾。

中間一度懷疑問題的原因可能是finalize方法中引用了類的靜態(tài)變量AtomicInteger會(huì)引起GC的問題(實(shí)際上這個(gè)方向是錯(cuò)誤的放前,GC是根據(jù)對(duì)象是否存在被引用關(guān)系來判斷對(duì)象是否回收,慚愧)糯彬,刪掉原來的方法體然后隨意在finalize方法中聲明了一個(gè)變量凭语,結(jié)果運(yùn)行時(shí)問題仍然存在。

到了此時(shí)撩扒,開始懷疑是不是和finalize方法體有關(guān)系了似扔,直接刪除掉finalize方法體中的所有內(nèi)容吨些,運(yùn)行后發(fā)現(xiàn)問題真的不存在了!

由于出現(xiàn)GC問題時(shí)內(nèi)存堆中存在大量Finalizer對(duì)象炒辉,而Finalizer對(duì)象只能通過Finalizer類的靜態(tài)register方法創(chuàng)建豪墅,因此嘗試在register方法中加上斷點(diǎn)對(duì)兩種情況分別運(yùn)行,發(fā)現(xiàn)方法體為空時(shí)黔寇,register方法不會(huì)被調(diào)用偶器,這樣自定義對(duì)象便沒有被任何對(duì)象引用,可以輕松的被GC回收掉缝裤。

由于register方法是被VM所調(diào)用屏轰,只能求助于莫樞大神,而莫樞也確認(rèn)了只要Java類以及它所有的祖先類中不含有finalize方法或者finalize方法體為空時(shí)憋飞,VM便不會(huì)將該類的對(duì)象實(shí)例注冊(cè)為finalizable對(duì)象(地址)霎苗。

至此,算是把整個(gè)問題的來龍去脈給整理的差不多了:

JVM創(chuàng)建自定義對(duì)象榛做。

JVM檢測(cè)對(duì)象類以及祖先類是否含有非空的finalize方法定義唁盏,如果均沒有,則不進(jìn)行后續(xù)的Finalizer相關(guān)處理检眯。

JVM調(diào)用Finalizer類的靜態(tài)register方法厘擂,創(chuàng)建包含該對(duì)象引用的Finalizer對(duì)象,同時(shí)Finalizer靜態(tài)類將該Finalizer對(duì)象加入到一個(gè)單向鏈表中轰传。

運(yùn)行過程中驴党,JVM會(huì)將這些Finalizer對(duì)象的狀態(tài)更新為pending(這部分可以參考java.lang.ref.Reference類中的說明)。

Reference類中的ReferenceHandler線程會(huì)掃描到這些狀態(tài)為pending的Finalizer對(duì)象获茬,將這些對(duì)象enqueue到Finalizer靜態(tài)類引用的ReferenceQueue(非Finalizer中的單向鏈表)當(dāng)中。

Finalizer線程從ReferenceQueue中逐一彈出Finalizer對(duì)象倔既,首先將Finalizer對(duì)象從Finalizer的單向鏈表中刪除恕曲,解除了Finalizer靜態(tài)類對(duì)Finalizer對(duì)象的引用關(guān)系,之后調(diào)用Finalizer對(duì)象引用的自定義對(duì)象的finalize方法渤涌,F(xiàn)inalizer對(duì)象以及自定義對(duì)象此時(shí)均可被GC回收佩谣。

由于Finalizer線程的低優(yōu)先級(jí),可能引起舊對(duì)象的釋放速度無法跟上新對(duì)象的創(chuàng)建速度实蓬,引起OutOfMemory問題(例子中的GC overhead limit原因是由于新對(duì)象創(chuàng)建的代價(jià)太低而舊對(duì)象回收的代價(jià)較高導(dǎo)致CPU用于GC回收的時(shí)間比例超過98%)

最后茸俭,網(wǎng)易研究院的馬進(jìn)在他的博客中非常詳細(xì)的闡述了finalize的原理以及因此引發(fā)的案例,也非常值得一讀安皱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调鬓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酌伊,更是在濱河造成了極大的恐慌腾窝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虹脯,居然都是意外死亡驴娃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門循集,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唇敞,“玉大人,你說我怎么就攤上這事咒彤『窨茫” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵蔼紧,是天一觀的道長(zhǎng)婆硬。 經(jīng)常有香客問我,道長(zhǎng)奸例,這世上最難降的妖魔是什么彬犯? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮查吊,結(jié)果婚禮上谐区,老公的妹妹穿的比我還像新娘。我一直安慰自己逻卖,他們只是感情好宋列,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著评也,像睡著了一般炼杖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盗迟,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天坤邪,我揣著相機(jī)與錄音,去河邊找鬼罚缕。 笑死艇纺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邮弹。 我是一名探鬼主播黔衡,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腌乡!你這毒婦竟也來了盟劫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤导饲,失蹤者是張志新(化名)和其女友劉穎捞高,沒想到半個(gè)月后氯材,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硝岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年氢哮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片型檀。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冗尤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胀溺,到底是詐尸還是另有隱情裂七,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布仓坞,位于F島的核電站背零,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏无埃。R本人自食惡果不足惜徙瓶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉称。 院中可真熱鬧侦镇,春花似錦、人聲如沸织阅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荔棉。三九已至闹炉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間江耀,已是汗流浹背剩胁。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祥国,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓晾腔,卻偏偏與公主長(zhǎng)得像舌稀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灼擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容