G1垃圾回收器

1殴蓬、JVM垃圾收集器發(fā)展過程

1立润、第一階段:Serial(串行)收集器
特點(diǎn):單線程收集器狂窑,垃圾回收時(shí),必須暫停其他所有工作線程桑腮。
2泉哈、第二階段:Parallel(并行)收集器
特點(diǎn):充分利用多核特性,使用多線程完成清理工作。
3丛晦、第三階段:CMS(并發(fā))收集器
特點(diǎn):垃圾收集線程和用戶線程奕纫,可以同時(shí)執(zhí)行。
缺點(diǎn):CPU資源敏感采呐;無法處理浮動(dòng)垃圾若锁;大量?jī)?nèi)存碎片
初始標(biāo)記:【需要停頓】。只標(biāo)記GC ROOTS能直接關(guān)聯(lián)到的對(duì)象斧吐,速度很快
并發(fā)標(biāo)記:與用戶線程同時(shí)執(zhí)行又固。標(biāo)記GC ROOTS所有能關(guān)聯(lián)到的對(duì)象。
重新標(biāo)記:【需要停頓】煤率。修正并發(fā)標(biāo)記期間仰冠,因用戶程序執(zhí)行導(dǎo)致標(biāo)記變動(dòng)的記錄。
并發(fā)清除:與用戶線程同時(shí)執(zhí)行蝶糯,清理標(biāo)記的垃圾對(duì)象洋只。會(huì)產(chǎn)生浮動(dòng)垃圾
4、第四階段:G1(Garbage-First)(并發(fā))收集器
特點(diǎn):引入分區(qū)(分治昼捍、部分收集)识虚,弱化分代。關(guān)注最小時(shí)延妒茬,適合大尺寸堆內(nèi)存担锤。應(yīng)用在多處理器和大容量?jī)?nèi)存環(huán)境中,盡量縮短處理超大堆(大于4GB)時(shí)乍钻,產(chǎn)生的停頓肛循。帶有整理功能,相對(duì)CMS內(nèi)存碎片的產(chǎn)生率大大降低银择;STW可控多糠,停頓時(shí)間上加了預(yù)測(cè)機(jī)制

2、G1收集器對(duì)比CMS

1浩考、算法:基于標(biāo)記-整理算法夹孔,碎片產(chǎn)生率降低。CMS有可能出現(xiàn)分配大對(duì)象時(shí)怀挠,無法得到連續(xù)空間而導(dǎo)致提前觸發(fā)一次full gc析蝴。
2、停頓時(shí)間可控:通過設(shè)置預(yù)期停頓時(shí)間绿淋,控制gc時(shí)間,避免應(yīng)用雪崩尝盼。
3吞滞、收集區(qū)域:G1雖然保留了新老代的概念,但是收集器是以整個(gè)區(qū)域?yàn)閱挝皇占摹1可以在Young GC中使用裁赠,CMS只能在Old區(qū)(常搭配ParNew收集年輕代)殿漠。
4、Remark階段高效:RSet解決跨代引用(如Old區(qū)域引用Young區(qū)域?qū)ο?佩捞、SATB算法記錄漏標(biāo)對(duì)象绞幌。
1.G1之前JVM內(nèi)存模型

image.png

2.G1收集器的內(nèi)存模型
Humongous:存放大對(duì)象(超過Region容量的一半)。
image.png

4一忱、G1重點(diǎn)參數(shù)
-XX:+UseG1GC:啟用G1收集器
-XX: G1HeapRegionSize:設(shè)置Region分區(qū)大小莲蜘。1M~32M,size越大垃圾存活時(shí)間長(zhǎng)帘营,gc間隔長(zhǎng)票渠,但gc的持續(xù)時(shí)間邊長(zhǎng)
-XX: MaxGCPauseMillis:最大GC停頓時(shí)間,軟目標(biāo)芬迄。

3问顷、G1收集器底層原理

1)G1運(yùn)作過程
1.初始標(biāo)記:標(biāo)記GC Roots能直接關(guān)聯(lián)到的對(duì)象。修改TAMS指針(Top at Mark Start)禀梳,【G1為每個(gè)Region分配了兩個(gè)指針杜窄,用于記錄回收過程中新對(duì)象的分配】,短暫停頓用戶線程算途,借用Minor GC時(shí)完成塞耕。
2.并發(fā)標(biāo)記:從GC Roots開始遞歸掃描整個(gè)堆,對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析郊艘『煽疲【與用戶線程并發(fā)執(zhí)行洁段,并發(fā)過程漏標(biāo)對(duì)象使用SATB(snapshot-at-the-beginning)算法記錄】
3.最終標(biāo)記:短暫停頓用戶線程讶凉,處理并發(fā)階段遺留的漏標(biāo)對(duì)象。
4.篩選回收:對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序烦秩,根據(jù)用戶期望的停頓時(shí)間狞贱,制定回收計(jì)劃刻获,回收一部分Region∠规遥【兩種回收模式蝎毡,Young GC、Mixed GC】

image.png

2)Young GC回收過程
分配一般對(duì)象(非巨型對(duì)象)時(shí)氧枣,所有E區(qū)使用達(dá)最大閾值且無法申請(qǐng)到足夠內(nèi)存時(shí)沐兵,進(jìn)行一次Young GC”慵啵回收所有S區(qū)和E區(qū)扎谎,將存活對(duì)象復(fù)制到O和另外S區(qū)碳想。
1.根掃描(初始標(biāo)記)。STW毁靶,掃描GC Roots對(duì)象
2.處理Dirty Card胧奔,更新Rset。
3.掃描Rset预吆。掃描Rset中所有Old區(qū)對(duì)Young區(qū)龙填、S區(qū)的引用。
4.對(duì)象拷貝拐叉。拷貝存活對(duì)象到S區(qū)和Old區(qū)岩遗。
3)Mixed GC回收過程
當(dāng)越來越多對(duì)象晉升到O區(qū)時(shí),為避免內(nèi)存耗盡巷嚣,虛擬機(jī)會(huì)觸發(fā)mixed gc喘先。回收整個(gè)E和S區(qū)廷粒,根據(jù)用戶期望停頓時(shí)間窘拯,回收一部分O區(qū)。

4坝茎、G1底層支持

1)三色標(biāo)記與漏標(biāo)問題
三色標(biāo)記
黑色:跟對(duì)象涤姊;或者該對(duì)象和他的子對(duì)象都被掃描過。
灰色:本身被掃描嗤放,但還未掃描該對(duì)象的子對(duì)象思喊。
白色:未被掃描的對(duì)象;掃描完所有對(duì)象后次酌,白色為不可達(dá)對(duì)象(垃圾對(duì)象)
漏標(biāo)問題

image.png

CMS中的解決方案:Incremental Update算法:當(dāng)一個(gè)白色的對(duì)象被一個(gè)黑色對(duì)象引用恨课,【將黑色對(duì)象重新標(biāo)記為灰色】,讓垃圾回收器重新掃描岳服。
G1中的解決方案:SATB(snapshot-at-the-beginning):當(dāng)B->C的引用鏈消失時(shí)剂公,將C推到GC的堆棧上,保證C還能被GC掃描到吊宋。
2)Rset解決跨代引用
現(xiàn)象:如果老年代引用了新生代的對(duì)象纲辽,那么回收新生代時(shí),要跟蹤老年代到新生代的所有引用璃搜。
image.png

Remembered Set:Hash表拖吼,Key是Region的地址,Value是對(duì)象的卡頁集合这吻〉醯担【其他Region中的對(duì)象引用本Region中對(duì)象的關(guān)系,表示誰引用了我的對(duì)象】
CardTable:如果一個(gè)O區(qū)CardTable中有對(duì)象指向Y區(qū)唾糯,就將它設(shè)置為Dirty籍铁,下次掃描時(shí)涡上,只需要掃描CardTable上是Dirty的內(nèi)存區(qū)域即可趾断。
3)TAMS(Top at Mark Start)指針
G1為每個(gè)Region區(qū)域設(shè)計(jì)了兩個(gè)TASM指針拒名。要達(dá)到與用戶線程并發(fā)運(yùn)行,必須要解決回收過程中新對(duì)象的分配芋酌。從Region區(qū)域劃分出一部分空間增显,用于記錄并發(fā)回收過程中的新對(duì)象產(chǎn)生,不納入垃圾回收范圍脐帝。
4)安全點(diǎn)與安全區(qū)域
安全點(diǎn):用戶線程暫停同云,GC線程開始工作,要確保用戶暫停的這行字節(jié)碼指令堵腹,【不會(huì)導(dǎo)致引用關(guān)系的變化】炸站,如【方法調(diào)用、循環(huán)跳轉(zhuǎn)疚顷、異常跳轉(zhuǎn)等】
主動(dòng)式中斷:設(shè)置一個(gè)標(biāo)志旱易,各用戶線程主動(dòng)輪訓(xùn)這個(gè)標(biāo)志,True則在最近的安全點(diǎn)上主動(dòng)中斷掛起腿堤。
安全區(qū)域:如果業(yè)務(wù)線程處于Sleep或者Blocked狀態(tài)阀坏,程序則沒辦法進(jìn)入安全點(diǎn)。作為安全點(diǎn)的擴(kuò)展【確保在某段代碼中笆檀,引用關(guān)系不會(huì)發(fā)生變化】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忌堂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酗洒,更是在濱河造成了極大的恐慌士修,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱衷,死亡現(xiàn)場(chǎng)離奇詭異棋嘲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)箫老,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門封字,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耍鬓,你說我怎么就攤上這事阔籽。” “怎么了牲蜀?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵笆制,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我涣达,道長(zhǎng)在辆,這世上最難降的妖魔是什么证薇? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮匆篓,結(jié)果婚禮上浑度,老公的妹妹穿的比我還像新娘。我一直安慰自己鸦概,他們只是感情好箩张,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窗市,像睡著了一般先慷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咨察,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天论熙,我揣著相機(jī)與錄音,去河邊找鬼摄狱。 笑死脓诡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的二蓝。 我是一名探鬼主播誉券,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼刊愚!你這毒婦竟也來了踊跟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸥诽,失蹤者是張志新(化名)和其女友劉穎商玫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牡借,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拳昌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钠龙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬藤。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碴里,靈堂內(nèi)的尸體忽然破棺而出沈矿,到底是詐尸還是另有隱情,我是刑警寧澤咬腋,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布羹膳,位于F島的核電站,受9級(jí)特大地震影響根竿,放射性物質(zhì)發(fā)生泄漏陵像。R本人自食惡果不足惜就珠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醒颖。 院中可真熱鬧妻怎,春花似錦、人聲如沸图贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疏日。三九已至,卻和暖如春撒汉,著一層夾襖步出監(jiān)牢的瞬間沟优,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工睬辐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挠阁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓溯饵,卻偏偏與公主長(zhǎng)得像侵俗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰刊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 1隘谣、背景 G1(Garbage First Collector 垃圾優(yōu)先的收集器),說是一種全新的啄巧,其實(shí)G1垃圾收...
    得力小泡泡閱讀 1,028評(píng)論 0 0
  • JVM提供了Serial收集器寻歧,Parallel收集器和CMS(Concurrent Mark-Sweep)并發(fā)標(biāo)...
    zhglance閱讀 1,190評(píng)論 0 4
  • 目錄 基礎(chǔ)知識(shí) G1回收流程 GC日志解析 線上參數(shù) 調(diào)優(yōu)案例 基礎(chǔ)知識(shí) 目的 G1 的主要關(guān)注點(diǎn)在于達(dá)到可控的停...
    后來丶_a24d閱讀 340評(píng)論 0 1
  • 因?yàn)镚1的堆內(nèi)存劃分和這不太一樣。我就來詳細(xì)的探討下G1秩仆。G1收集器采用不同的方法來分配堆码泛, G1 將內(nèi)存分配為 ...
    風(fēng)雨it路閱讀 1,206評(píng)論 0 0
  • 在前一篇的文章《HotSpot垃圾回收算法概述》里面,對(duì)于Serial, Parallel和CMS幾種垃圾回收器做...
    flycash閱讀 73,165評(píng)論 21 80