[JAVA] JVM垃圾回收 - HotSpot的算法細(xì)節(jié)實現(xiàn)

本文介紹JVM垃圾回收算法的具體實現(xiàn),介紹各個術(shù)語扇调,并圖文并茂介紹具體的實現(xiàn)細(xì)節(jié)汪榔。
垃圾回收判定及回收過程如下:


1653579682.png

1、可達(dá)性分析算法

通過GC Roots的根對象作為起始節(jié)點集肃拜,從這些節(jié)點開始痴腌,根據(jù)引用關(guān)系向下搜索,如果對象沒有被引用鏈引用到燃领,則判斷對象為可回收對象士聪。

2、GC Roots

根節(jié)點枚舉要掃描的對象集猛蔽,如下:

  • 虛擬機棧中引用的對象
  • 方法區(qū)中類靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象
  • 本地方法棧中JNI(Native)引用的對象
  • Java虛擬機內(nèi)部的引用
  • 所有被同步鎖(synchronized)持有的對象
  • 反應(yīng)Java虛擬機內(nèi)部情況的JMXBean剥悟、JVMTI中注冊的回調(diào)、本地代碼緩存等曼库。

3区岗、根節(jié)點枚舉

掃描GC Roots集合查找引用鏈,這是Stop The World的操作,即所有用戶線程均要暫停毁枯,這是非常耗時的慈缔。即使號稱停頓時間可控,或者(幾乎)不會發(fā)生停頓的CMS种玛、G1藐鹤、ZGC等收集器,枚舉根節(jié)點也是要暫停的赂韵。
可達(dá)性分析算法耗時最長的查找引用鏈的過程已經(jīng)可以做到與用戶線程一起并發(fā)娱节,但根節(jié)點枚舉始終還是必須在一個能保障一致性的快照中才得以進(jìn)行。
使用OopMap來快速找到虛擬機棧的引用祭示。

4肄满、OopMap

知道棧的哪個位置存放著對象引用。

5、安全點

OopMap的協(xié)助下稠歉,HotSpot可以快速準(zhǔn)確地完成GC Roots枚舉讥电。
執(zhí)行指令后,在特定位置記錄OopMap信息轧抗,這些位置成為安全點恩敌。

  • 搶先式中斷 - 馬上暫定所有用戶線程 - 現(xiàn)在沒有這么做的
  • 主動式中斷 - 線程去主動輪詢一個標(biāo)記,發(fā)現(xiàn)為真的時候就在最近的安全點上主動中斷掛起横媚。- 輪詢操作精簡為了一條匯編指令 test

6纠炮、安全區(qū)域

在這里引用關(guān)系不會發(fā)生改變,垃圾回收時不會管這些線程灯蝴,代碼執(zhí)行到要出安全區(qū)域的時候才會判定是否需要暫停恢口。

7、記憶集

存在問題: 在部分區(qū)域收集中穷躁,當(dāng)存在跨代引用耕肩,例如老年代引用新生代,那么新生代就不能被回收问潭。G1的的分區(qū)域收集也是如此猿诸。
經(jīng)驗法則分代假說:
1、弱分代假說: 絕大多數(shù)對象都是朝生夕滅的狡忙。
2梳虽、強分代假說: 熬過越多此垃圾收集過程的對象就越難以消亡。
3灾茁、跨代引用假說: 跨代引用相對于同代引用來說僅占極少數(shù)窜觉。
由以上假說可推理出,如果有跨代引用北专,則新生代晉升到老年代后禀挫,這種跨代引用也隨即被消除了。所以可以不為了少量的跨代引用而掃描整個老年代拓颓,這種代價太昂貴语婴,所以出現(xiàn)了記憶集

記憶集把老年代劃分成若干個小塊录粱,標(biāo)識出哪一塊內(nèi)存存在跨代引用腻格,此后發(fā)生Minor GC的時候,只有這小部分才會被加入GC Roots進(jìn)行掃描啥繁。

8、卡表

卡表記憶集的一種具體實現(xiàn)青抛,它定義了記憶集的記錄精度旗闽、與堆內(nèi)存的映射關(guān)系等。

有三精度
1、字長精度
2适室、對象精度
3嫡意、卡精度 - 每個記錄精確到一塊內(nèi)存區(qū)域,該區(qū)域內(nèi)有對象含有跨代指針捣辆。

卡表最簡單的形式可以是一個字節(jié)數(shù)組蔬螟,可表示為CARD_TABLE[this address >> 9] = 0,其中每一個元素是一個特定大小的內(nèi)存塊汽畴,成為卡頁旧巾。

9、卡頁

hotSpot中每個卡頁都是512字節(jié)忍些,每個卡頁包含不止一個對象鲁猩,只要有一個存在跨代指針,那么卡表的數(shù)組元素的值則為1罢坝,成為變臟廓握,否則為0。垃圾回收時嘁酿,篩選出變臟的元素隙券,加入到GC Roots一起進(jìn)行掃描。

10闹司、寫屏障

維護(hù)卡表狀態(tài)

寫屏障可以看作在虛擬機層面對"引用類型字段賦值"這個動作的AOP切面是尔,在引用對象賦值時會產(chǎn)生一個環(huán)形通知,供程序執(zhí)行額外的動作

G1之前都是寫后屏障开仰,在執(zhí)行引用字段賦值后拟枚,會更新卡表狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末众弓,一起剝皮案震驚了整個濱河市恩溅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓娃,老刑警劉巖脚乡,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滨达,居然都是意外死亡奶稠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門捡遍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌订,“玉大人,你說我怎么就攤上這事画株×酒” “怎么了啦辐?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜈项。 經(jīng)常有香客問我芹关,道長紧卒,這世上最難降的妖魔是什么侥衬? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮跑芳,結(jié)果婚禮上轴总,老公的妹妹穿的比我還像新娘。我一直安慰自己聋亡,他們只是感情好肘习,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坡倔,像睡著了一般漂佩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罪塔,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天投蝉,我揣著相機與錄音,去河邊找鬼征堪。 笑死瘩缆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佃蚜。 我是一名探鬼主播庸娱,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谐算!你這毒婦竟也來了熟尉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洲脂,失蹤者是張志新(化名)和其女友劉穎斤儿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恐锦,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡往果,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了一铅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕贮。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馅闽,靈堂內(nèi)的尸體忽然破棺而出飘蚯,到底是詐尸還是另有隱情馍迄,我是刑警寧澤福也,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布局骤,位于F島的核電站,受9級特大地震影響暴凑,放射性物質(zhì)發(fā)生泄漏峦甩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一现喳、第九天 我趴在偏房一處隱蔽的房頂上張望凯傲。 院中可真熱鬧,春花似錦嗦篱、人聲如沸冰单。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诫欠。三九已至,卻和暖如春浴栽,著一層夾襖步出監(jiān)牢的瞬間荒叼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工典鸡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留被廓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓萝玷,卻偏偏與公主長得像嫁乘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子球碉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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