Carson帶你學(xué)JVM:Java對(duì)象如何判斷存活原則-引用計(jì)數(shù)法 & 引用鏈法

前言

  • 如何判斷一個(gè)Java對(duì)象是否存活對(duì)于垃圾回收茁帽、防止內(nèi)存泄漏等十分重要
  • 本文將全面講解判斷Java對(duì)象存活的方式饶唤,希望你們會(huì)喜歡

Carson帶你學(xué)JVM系列文章敏簿,具體如下:
Carson帶你學(xué)JVM:這是一份全面 & 詳細(xì)的JVM學(xué)習(xí)指南
Carson帶你學(xué)JVM:圖文解析Java虛擬機(jī)內(nèi)存結(jié)構(gòu)
Carson帶你學(xué)JVM:Java對(duì)象的創(chuàng)建媳搪、內(nèi)存布局 & 訪問定位全過程解析
Carson帶你學(xué)JVM:Java對(duì)象如何判斷存活原則-引用計(jì)數(shù)法 & 引用鏈法
Carson帶你學(xué)JVM:這是一份全面 & 詳細(xì)的垃圾收集算法(GC)講解攻略
Carson帶你學(xué)JVM:常見的垃圾收集器學(xué)習(xí)指南
Carson帶你學(xué)JVM:類加載的全過程解析
Carson帶你學(xué)JVM:你真的了解類加載器嗎?(含雙親委派模型)
Carson帶你學(xué)JVM:方法分派模型-靜態(tài)分派瞧毙、動(dòng)態(tài)分派


目錄

示意圖

1. 判斷方式

  • 垃圾收集器對(duì) Java堆里的對(duì)象 是否進(jìn)行回收的判斷準(zhǔn)則:Java對(duì)象是存活 or 死亡胧华,只有判斷對(duì)象為死亡才會(huì)進(jìn)行回收
  • 在Java虛擬機(jī)中宙彪,判斷對(duì)象是否存活有2種方法:引用計(jì)數(shù)法矩动、引用鏈法(可達(dá)性分析法)

下面會(huì)進(jìn)行詳細(xì)介紹。


2. 引用計(jì)數(shù)法

2.1 方式描述

  • Java 對(duì)象添加一個(gè)引用計(jì)數(shù)器
  • 每當(dāng)有一個(gè)地方引用它時(shí)释漆,計(jì)數(shù)器 +1悲没;引用失效則 -1;

2.2 判斷對(duì)象存活準(zhǔn)則

當(dāng)計(jì)數(shù)器不為 0 時(shí)男图,判斷該對(duì)象存活示姿;否則判斷為死亡(計(jì)數(shù)器 = 0)甜橱。

2.3 優(yōu)點(diǎn)

  • 實(shí)現(xiàn)簡(jiǎn)單
  • 判斷高效

2.4 缺點(diǎn)

  • 無法解決 對(duì)象間相互循環(huán)引用 的問題

即該算法存在判斷邏輯的漏洞

  • 具體描述
<-- 背景 -->
// 對(duì)象objA 和 objB 都有字段 name
// 兩個(gè)對(duì)象相互進(jìn)行引用,除此之外這兩個(gè)人對(duì)象沒有任何引用
objA.name = objB栈戳;
objB.name = objA岂傲;

<-- 問題 -->
// 實(shí)際上這兩個(gè)對(duì)象已經(jīng)不可能再被訪問,應(yīng)該要被垃圾收集器進(jìn)行回收
// 但因?yàn)樗麄兿嗷ヒ米犹矗詫?dǎo)致計(jì)數(shù)器不為0镊掖,這導(dǎo)致引用計(jì)數(shù)算法無法通知垃圾收集器回收該兩個(gè)對(duì)象

正由于該算法存在判斷邏輯漏洞,所以 Java虛擬機(jī)沒有采用該算法判斷Java是否存活命锄。


3. 引用鏈法(可達(dá)性分析法)

  • 很多主流商用語(yǔ)言(如Java堰乔、C#)都采用 引用鏈法 判斷 Java對(duì)象是否存活。
  • 含3個(gè)步驟:
    1. 可達(dá)性分析
    2. 第一次標(biāo)記 & 篩選
    3. 第二次標(biāo)記 & 篩選

3.1 可達(dá)性分析

a. 方式描述

將一系列的 GC Roots 對(duì)象作為起點(diǎn)脐恩,從這些起點(diǎn)開始向下搜索。

  • 可作為 GC Root 的對(duì)象有:
    1.Java虛擬機(jī)棧(棧幀的本地變量表)中引用的對(duì)象
    2.本地方法棧 中 JNI引用對(duì)象
    3.方法區(qū) 中常量侦讨、類靜態(tài)屬性引用的對(duì)象
  • 向下搜索的路徑 = 引用鏈

如下圖:

示意圖

b. 判斷 對(duì)象是否可達(dá) 標(biāo)準(zhǔn)

當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連時(shí)驶冒,則判斷該對(duì)象不可達(dá)

沒有任何引用鏈相連 = GC Root到對(duì)象不可達(dá) = 對(duì)象不可用

示意圖

特別注意

  • 可達(dá)性分析 僅僅只是判斷對(duì)象是否可達(dá),但還不足以判斷對(duì)象是否存活 / 死亡
  • 當(dāng)在 可達(dá)性分析 中判斷不可達(dá)的對(duì)象韵卤,只是“被判刑” = 還沒真正死亡

不可達(dá)對(duì)象會(huì)被放在”即將回收“的集合里骗污。

  • 要判斷一個(gè)對(duì)象真正死亡,還需要經(jīng)歷兩個(gè)階段:
    1. 第一次標(biāo)記 & 篩選
    2. 第二次標(biāo)記 & 篩選

3.2 第一次標(biāo)記 & 篩選

  • 對(duì)象 在 可達(dá)性分析中 被判斷為不可達(dá)后沈条,會(huì)被第一次標(biāo)記 & 準(zhǔn)備被篩選

a. 不篩選:繼續(xù)留在 ”即將回收“的集合里需忿,等待回收;
b. 篩選:從 ”即將回收“的集合取出

  • 篩選的標(biāo)準(zhǔn):該對(duì)象是否有必要執(zhí)行 finalize()方法
    1. 若有必要執(zhí)行(人為設(shè)置)蜡歹,則篩選出來屋厘,進(jìn)入下一階段(第二次標(biāo)記 & 篩選);
    2. 若沒必要執(zhí)行月而,判斷該對(duì)象死亡汗洒,不篩選 并等待回收

當(dāng)對(duì)象無 finalize()方法 或 finalize()已被虛擬機(jī)調(diào)用過,則視為“沒必要執(zhí)行”


3.3 第二次標(biāo)記 & 篩選

當(dāng)對(duì)象經(jīng)過了第一次的標(biāo)記 & 篩選父款,會(huì)被進(jìn)行第二次標(biāo)記 & 準(zhǔn)備被進(jìn)行 篩選

a. 方式描述

該對(duì)象會(huì)被放到一個(gè) F-Queue 隊(duì)列中溢谤,并由 虛擬機(jī)自動(dòng)建立、優(yōu)先級(jí)低的Finalizer 線程去執(zhí)行 隊(duì)列中該對(duì)象的finalize()

  1. finalize()只會(huì)被執(zhí)行一次
  2. 但并不承諾等待finalize()運(yùn)行結(jié)束憨攒。這是為了防止 finalize()執(zhí)行緩慢 / 停止 使得 F-Queue隊(duì)列其他對(duì)象永久等待世杀。

b. 篩選標(biāo)準(zhǔn)

在執(zhí)行finalize()過程中,若對(duì)象依然沒與引用鏈上的GC Roots 直接關(guān)聯(lián) 或 間接關(guān)聯(lián)(即關(guān)聯(lián)上與GC Roots 關(guān)聯(lián)的對(duì)象)肝集,那么該對(duì)象將被判斷死亡瞻坝,不篩選(留在”即將回收“集合里) 并 等待回收


3.4 總結(jié)

3步驟 + 以下流程


示意圖

4. 總結(jié)

  • 本文全面講解判斷Java對(duì)象存活的方式
  • 接下來我會(huì)對(duì)Java虛擬機(jī)(JVM)進(jìn)行詳細(xì)的分析,歡迎關(guān)注Carson_Ho的簡(jiǎn)書包晰,不定期分享關(guān)于安卓開發(fā)的干貨湿镀,追求短炕吸、平、快勉痴,但卻不缺深度赫模。

請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力蒸矛!

Carson帶你學(xué)JVM系列文章瀑罗,具體如下:

Carson帶你學(xué)JVM:這是一份全面 & 詳細(xì)的JVM學(xué)習(xí)指南

Carson帶你學(xué)JVM:圖文解析Java虛擬機(jī)內(nèi)存結(jié)構(gòu)
Carson帶你學(xué)JVM:Java對(duì)象的創(chuàng)建、內(nèi)存布局 & 訪問定位全過程解析
Carson帶你學(xué)JVM:Java對(duì)象如何判斷存活原則-引用計(jì)數(shù)法 & 引用鏈法
Carson帶你學(xué)JVM:這是一份全面 & 詳細(xì)的垃圾收集算法(GC)講解攻略
Carson帶你學(xué)JVM:常見的垃圾收集器學(xué)習(xí)指南
Carson帶你學(xué)JVM:類加載的全過程解析
Carson帶你學(xué)JVM:你真的了解類加載器嗎雏掠?(含雙親委派模型)
Carson帶你學(xué)JVM:方法分派模型-靜態(tài)分派斩祭、動(dòng)態(tài)分派

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乡话,隨后出現(xiàn)的幾起案子摧玫,更是在濱河造成了極大的恐慌,老刑警劉巖绑青,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诬像,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闸婴,警方通過查閱死者的電腦和手機(jī)坏挠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邪乍,“玉大人降狠,你說我怎么就攤上這事”永悖” “怎么了榜配?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姐刁。 經(jīng)常有香客問我芥牌,道長(zhǎng),這世上最難降的妖魔是什么聂使? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任壁拉,我火速辦了婚禮,結(jié)果婚禮上柏靶,老公的妹妹穿的比我還像新娘弃理。我一直安慰自己呼盆,他們只是感情好藕施,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布翼悴。 她就那樣靜靜地躺著蕊肥,像睡著了一般沼溜。 火紅的嫁衣襯著肌膚如雪属韧。 梳的紋絲不亂的頭發(fā)上楼镐,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天忿族,我揣著相機(jī)與錄音,去河邊找鬼驻啤。 笑死菲驴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骑冗。 我是一名探鬼主播赊瞬,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贼涩!你這毒婦竟也來了巧涧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤遥倦,失蹤者是張志新(化名)和其女友劉穎谤绳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谊迄,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闷供,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统诺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疑俭,死狀恐怖粮呢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钞艇,我是刑警寧澤啄寡,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站哩照,受9級(jí)特大地震影響挺物,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飘弧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一识藤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次伶,春花似錦痴昧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春豪娜,著一層夾襖步出監(jiān)牢的瞬間餐胀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工瘤载, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留否灾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓惕虑,卻偏偏與公主長(zhǎng)得像坟冲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溃蔫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 郭相麟 小時(shí)候 您是我幸福的依靠 帶著我 讓幼小的心靈擁抱蔚藍(lán)的天空 我長(zhǎng)大了 您卻步入生命的衰老階段 生與死的離...
    郭相麟閱讀 193評(píng)論 0 0
  • 討厭了好久的一個(gè)人 終于把好友刪了 是因?yàn)樗l(fā)了他們一起的照片 我覺得很垃圾 一部分原因覺得他很垃圾 大部分覺得...
    cbfcb164b109閱讀 376評(píng)論 0 0
  • 1健提、語(yǔ)言慣性 2、思考慣性 3伟叛、動(dòng)作慣性 一個(gè)人動(dòng)作的品質(zhì)決定他人生的品質(zhì)~ 改變動(dòng)作私痹、改變呼吸、臉部表情~重復(fù)實(shí)踐
    張藝凡58閱讀 148評(píng)論 0 0
  • 很多時(shí)候覺得自己是幸運(yùn)體 懶惰不愛付出 卻也能馬馬虎虎有所獲 感覺自己得到的 很多都是僥幸啊 失去的 可能就叫做生...
    小泡桐花閱讀 204評(píng)論 0 0