JVM怎么判斷對象是否已死纺棺?

Java虛擬機中有著垃圾回收機制榄笙,自動幫我們回收對象,不需要自己手動實現(xiàn)垃圾回收祷蝌。那么JVM中的垃圾收集器是如何判斷對象是否需要回收的呢茅撞?這將是本篇文章的主要內(nèi)容。

一巨朦、引用計數(shù)法

給對象添加一個引用計數(shù)器乡翅,每當有一個地方引用它時,計數(shù)器值就加1罪郊;當引用失效時蠕蚜,計數(shù)器值就減1;任何時刻計數(shù)器為0的對象就是不可能被再使用的悔橄。

主流的JVM里面沒有選用引用計數(shù)算法來管理內(nèi)存靶累,其中最主要的原因是它很難解決對象間的互循環(huán)引用的問題。

二癣疟、可達性分析算法

通過一些列的稱為“GC Roots”的對象作為起始點挣柬,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈睛挚,當一個對象到GC Roots沒有任何引用鏈相連時(就是從GC Roots 到這個對象是不可達)邪蛔,則證明此對象是不可用的。所以它們會被判定為可回收對象(例如圖B中的對象既是不可達的)扎狱。


在可達性分析算法中侧到,要真正宣告一個對象死亡勃教,至少要經(jīng)歷兩次標記過程:

1.如果對象在進行可達性分析后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,那它將會被第一次標記并且進行一次篩選匠抗,篩選的條件是此對象是否有必要執(zhí)行finalize()方法故源。當對象沒有 覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機調(diào)用過汞贸,虛擬機將這兩種情況都視為“沒有必要執(zhí)行”绳军。

2.如果這個對象被判定為有必要執(zhí)行finalize()方法,那么這個對象將會放置在一個叫做F-Queue隊列之中矢腻,并在稍后由一個由虛擬機自動建立的门驾、低優(yōu)先級的Finalizer線程去執(zhí)行它。finalize()方法是對象逃脫死亡命運的最后一次機會多柑,稍候GC將對F-Queue中的對象進行第二次小規(guī)模的標記奶是,如果對象要在finalie()中成功拯救自己——只要重新與引用鏈上的任何一個對象建立關(guān)聯(lián)即可,譬如把自己(this關(guān)鍵字)賦值給某個類變量或者對象的成員變量顷蟆,那在第二次標記時它將會被移除出“即將回收”的集合诫隅;如果對象這時候還沒有逃脫,那基本上它就真的被回收了帐偎。

三逐纬、判斷對象是否存活與“引用”有關(guān)

在JDK1.2之后,Java對引用的概念進行了擴充削樊,將引用分為強引用(Strong Reference)豁生、軟引用(Soft Reference)、弱引用(Weak Reference)漫贞、虛引用(Phantom Reference)四種甸箱,這四種引用強度依次逐漸減弱。

強引用:就是指在程序代碼之中普遍存在的迅脐,類似“Object obj = new Object()”這類的引用芍殖,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象谴蔑。

軟引用:用來描述一些還有用但并非必須的對象豌骏。在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會把這些對象列進回收范圍之中進行第二次回收隐锭。

弱引用:用戶描述非必須對象的窃躲。被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前。當垃圾收集器工作時钦睡,無論當前內(nèi)存是否足夠蒂窒,都會回收掉只被弱引用關(guān)聯(lián)的對象。

虛引用:一個對象是否有虛引用存在,完全不會對其生存時間構(gòu)成影響洒琢,也無法通過虛引用來取得一個對象實例秧秉。為一個對象設置虛引用的唯一目的就是能在這個對象被收集器回收時刻得到一個系統(tǒng)通知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纬凤,一起剝皮案震驚了整個濱河市福贞,隨后出現(xiàn)的幾起案子撩嚼,更是在濱河造成了極大的恐慌停士,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件完丽,死亡現(xiàn)場離奇詭異恋技,居然都是意外死亡,警方通過查閱死者的電腦和手機逻族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門蜻底,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聘鳞,你說我怎么就攤上這事薄辅。” “怎么了抠璃?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵站楚,是天一觀的道長。 經(jīng)常有香客問我搏嗡,道長窿春,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任采盒,我火速辦了婚禮旧乞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磅氨。我一直安慰自己尺栖,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布烦租。 她就那樣靜靜地躺著延赌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪左权。 梳的紋絲不亂的頭發(fā)上皮胡,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音赏迟,去河邊找鬼屡贺。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的甩栈。 我是一名探鬼主播泻仙,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼量没!你這毒婦竟也來了玉转?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤殴蹄,失蹤者是張志新(化名)和其女友劉穎究抓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭灯,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡刺下,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稽荧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘茉。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姨丈,靈堂內(nèi)的尸體忽然破棺而出畅卓,到底是詐尸還是另有隱情,我是刑警寧澤蟋恬,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布翁潘,位于F島的核電站,受9級特大地震影響筋现,放射性物質(zhì)發(fā)生泄漏唐础。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一矾飞、第九天 我趴在偏房一處隱蔽的房頂上張望一膨。 院中可真熱鬧,春花似錦洒沦、人聲如沸豹绪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞒津。三九已至,卻和暖如春括尸,著一層夾襖步出監(jiān)牢的瞬間巷蚪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工濒翻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屁柏,地道東北人啦膜。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像淌喻,于是被迫代替她去往敵國和親僧家。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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

  • 一、引用計數(shù)法 給對象添加一個引用計數(shù)器涯塔,每當有一個地方引用它時肌稻,計數(shù)器值就加1;當引用失效時伤塌,計數(shù)器值就減1灯萍;任...
    Android進階與總結(jié)閱讀 218評論 0 0
  • 原文閱讀 前言 這段時間懈怠了轧铁,罪過每聪! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊齿风,這博客我...
    碼農(nóng)戲碼閱讀 5,952評論 2 31
  • 1.什么是垃圾回收药薯? 垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供...
    簡欲明心閱讀 89,451評論 17 311
  • 一. 垃圾回收的意義 在C++中,對象所占的內(nèi)存在程序結(jié)束運行之前一直被占用救斑,在明確釋放之前不能分配給其它對...
    Stan_Z閱讀 1,924評論 0 25
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡上收集的一些資料的整理童本,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 15,565評論 3 83