JVM的垃圾收集器

總覽

image.png

處于不同區(qū)域的垃圾收集器負(fù)責(zé)該區(qū)域(年輕代、老年代)的收集工作。有連線的表示可以搭配使用

Serial收集器

Serial收集器是一個(gè)單線程的垃圾收集器舍沙,這里的單線程強(qiáng)調(diào)的是進(jìn)行立即收集時(shí),其他線程必須暫停(stop the world)。運(yùn)行如下:但該收集器是所有收集中額外耗費(fèi)內(nèi)存(memory Footprint 指的是保證垃圾收集器能夠順利高效的進(jìn)行而存儲(chǔ)的額外信息)最小的歌粥。


image.png

ParNew收集器

ParNew其實(shí)是Serial的多線程并行版本,除了Serial之外稍途,目前只有它能配合CMS工作,其工作流程如圖所示:


image.png

它默認(rèn)開(kāi)啟的收集線程數(shù)與處理器核心數(shù)量相同砚婆。在這種多核處理器的條件下械拍,效率自然高于serial收集器。這里解釋一下垃圾收集中常匙岸ⅲ混淆的并發(fā)和并行兩個(gè)概念坷虑。

  • 并發(fā):并發(fā)描述的是垃圾收集線程和用戶線程之間的關(guān)系,表示同一時(shí)間有多條垃圾收集線程在工作
  • 并行:并行描述的是多個(gè)垃圾收集之間的關(guān)系埂奈,說(shuō)明同一時(shí)間迄损,垃圾線程和用戶線程都在運(yùn)行

Parallel Scavenge收集器

Parallel Scavenge收集器跟ParNew很相似,不同點(diǎn)在于該收集器更關(guān)注可控制的吞吐量,吞吐量指的是:


image.png

Parallel Scavenge通過(guò)以下兩個(gè)參數(shù)精確控制吞吐量:

  • -XX: MaxGCPauseMillis 最大垃圾收集停頓時(shí)間
  • -XX: GCTimeRatio 吞吐量大小
    -XX: MaxGCPauseMillis是一個(gè)大于0的毫秒數(shù)账磺,當(dāng)然不能指望設(shè)置的越小越好芹敌,收集器只會(huì)盡可能的完成這個(gè)目標(biāo),同時(shí)花費(fèi)時(shí)間減少是通過(guò)犧牲年輕代內(nèi)存大小和吞吐量完成的垮抗。導(dǎo)致垃圾收集更頻繁氏捞,吞吐量下降。
    除此之外冒版,Parallel Scavenge收集器還有一個(gè)參數(shù)值得關(guān)注:
  • -XX:+UseAdaptiveSizePolicy
    該參數(shù)被激活后液茎,表示不需要人工指定新生代的大小(-Xmn)、Eden和Survivor區(qū)的比例(-XX:SurvivoRatio)捆等、晉升老年代對(duì)象大小(-XX:PretenureSizeThreshold)等細(xì)節(jié)參數(shù) 虛擬機(jī)會(huì)動(dòng)態(tài)調(diào)整以提供最合適的停頓時(shí)間和吞吐量滞造。

Serial Old收集器

Serial Old收集器是Serial的老年代版本,同樣是單線程收集器栋烤,使用標(biāo)記-整理算法谒养,用途如下:

  • 在客戶端模式下,供HotSpot虛擬機(jī)使用
  • 服務(wù)端模式下班缎,在Jdk5之前與Parallel Scavenge搭配使用蝴光,另一種是作為CMS收集器的失敗后備預(yù)案。


    image.png

Parallel Old收集器

Parallel Old是Parallel Scavenge的老年代版本达址,多線程蔑祟,標(biāo)記整理算法,兩者搭配使用沉唠,成為名副其實(shí)的“吞吐量?jī)?yōu)先”的搭配組合疆虚。在吞吐量和資源稀缺的場(chǎng)合,可以優(yōu)先考慮該搭配組合满葛。


image.png

CMS收集器

CMS收集器是一種旨在獲取最短停頓時(shí)間的垃圾收集器径簿,運(yùn)作過(guò)程包含以下四個(gè)步驟:

  • 初始標(biāo)記
  • 并發(fā)標(biāo)記
  • 重新標(biāo)記
  • 并發(fā)清除
    其中初始標(biāo)記和重新標(biāo)記是需要暫停用戶線程的,并發(fā)標(biāo)記和并發(fā)清除是和用戶線程一起執(zhí)行的嘀韧,執(zhí)行流程圖如下所示:


    image.png

    雖然CMS收集器是一個(gè)低停頓篇亭、并發(fā)收集的收集器,但還是存在以下缺點(diǎn):

  • CMS默認(rèn)啟動(dòng)的回收線程數(shù)是(處理器核心數(shù)量+3) /4锄贷, 也就是說(shuō)译蒂, 如果處理器核心數(shù)在四個(gè)或以上, 并發(fā)回收時(shí)垃圾收集線程只占用不超過(guò)25%的處理器運(yùn)算資源谊却, 并且會(huì)隨著處理器核心數(shù)量的增加而下降柔昼。 但是當(dāng)處理器核心數(shù)量不足四個(gè)時(shí),CMS對(duì)用戶程序的影響就可能變得很大
  • 浮動(dòng)垃圾
    浮動(dòng)垃圾是指在CMS收集的并發(fā)標(biāo)記和并發(fā)清理過(guò)程中炎辨、由于是和用戶線程一起運(yùn)行的捕透,用戶線程就會(huì)不斷產(chǎn)生新的垃圾對(duì)象,而這些對(duì)象又是在垃圾收集后出現(xiàn)的碴萧。CMS收集器只能在下次垃圾收集時(shí)才能進(jìn)行回收乙嘀,這一部分被稱為“浮動(dòng)垃圾”。同時(shí)不同于其他收集器可以等到老年代滿了才進(jìn)行垃圾回收破喻,CMS是并發(fā)的乒躺,因此要預(yù)留空間給程序運(yùn)行使用。所以通過(guò)-XX: CMSInitiatingOccupancyFraction參數(shù)設(shè)置觸發(fā)CMS收集的老年代空間占用比例低缩。但是這個(gè)參數(shù)調(diào)的過(guò)高可能會(huì)引起Concurrent Mode Failure嘉冒,表示CMS預(yù)留的空間不足于程序新分配的對(duì)象曹货,此時(shí)CMS會(huì)啟動(dòng)后備方案,通過(guò)Serial OLd收集器進(jìn)行老年代回收
  • 空間碎片化 因?yàn)镃MS收集器是采用的標(biāo)記-清除算法

Garbage First收集器

開(kāi)創(chuàng)了面向局部收集的設(shè)計(jì)思路和基于Region的內(nèi)存布局形式讳推,是一款面向服務(wù)端的收集器顶籽,從JDK9開(kāi)始,替代了Parallel Scavenge搭配Parallel Old的收集器银觅,成為服務(wù)端默認(rèn)的垃圾收集器礼饱。
G1不再堅(jiān)持固定大小以及固定數(shù)量的分代區(qū)域劃分, 而是把連續(xù)的Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region) 究驴, 每一個(gè)Region都可以根據(jù)需要镊绪, 扮演新生代的Eden空間、 Survivor空間洒忧, 或者老年代空間蝴韭。
G1收集器中雖然還是存在新生代、老年代熙侍,但是不再是固定的榄鉴,而是不需要連續(xù)的動(dòng)態(tài)集合,它將Region作為最小的回收單元蛉抓,每個(gè)Region可以通過(guò)-XX:G1HeapRegionSize設(shè)置大小庆尘,Region中包含一個(gè)Humongous區(qū)域,存儲(chǔ)大對(duì)象巷送,對(duì)于超過(guò)Region一半大小的對(duì)象就存放在N個(gè)連續(xù)的Region的Humongous區(qū)域驶忌。
G1的收集思路是跟蹤每個(gè)Region的垃圾收集價(jià)值大小,即回收所獲得的空間大小和回收所需時(shí)間的經(jīng)驗(yàn)值笑跛,維護(hù)一個(gè)優(yōu)先級(jí)列表付魔,回收時(shí)優(yōu)先回收價(jià)值大的。

image.png

G1缺點(diǎn):

  • 需要為每一個(gè)Region維護(hù)一個(gè)卡表 內(nèi)存占用較高
  • 執(zhí)行負(fù)載高

Shenandoah收集器

Shenandoah收集器對(duì)比G1有所改進(jìn)堡牡,例如:

  • 支持并發(fā)回收 抒抬,G1雖然可以多線程執(zhí)行回收但是不能和用戶線程并發(fā)執(zhí)行
  • Shenandoah不支持分代收集
  • 摒棄記憶集 使用連接矩陣記錄跨Region的引用關(guān)系
    image.png

    該收集器大致分為以下9個(gè)階段:
    1.初始標(biāo)記 標(biāo)記與GC Roots直接關(guān)聯(lián)的對(duì)象 需暫停用戶線程
    2.并發(fā)標(biāo)記 與G1一樣杨刨, 遍歷對(duì)象圖晤柄, 標(biāo)記出全部可達(dá)的對(duì)象
    3.最終標(biāo)記 處理剩余的SATB掃描, 并在這個(gè)階段統(tǒng)計(jì)出回收價(jià)值
    最高的Region妖胀, 將這些Region構(gòu)成一組回收集 需暫停用戶線程
    4.并發(fā)清理 清理那些整個(gè)區(qū)域內(nèi)連一個(gè)存活對(duì)象都沒(méi)有找到
    的Region
    5.并發(fā)回收 Shenandoah要把回收集里面的存活對(duì)象先復(fù)制一份到其他未被使用的Region之中芥颈,通過(guò)轉(zhuǎn)發(fā)指針“Brooks Pointers”實(shí)現(xiàn)對(duì)象移動(dòng)后 原本指向這些對(duì)象的引用的改變
    6.初始引用更新 并發(fā)回收階段復(fù)制對(duì)象結(jié)束后, 還需要把堆中所有指向舊對(duì)象的引用修正到復(fù)制后的新地址 暫停用戶線程 引用更新的初始化階段實(shí)際上并未做什么具體的處理赚抡, 設(shè)立這個(gè)階段只是為了建立一個(gè)線程集合點(diǎn)爬坑, 確保所有并發(fā)回收階段中進(jìn)行的收
    集器線程都已完成分配給它們的對(duì)象移動(dòng)任務(wù)而已

    7.并發(fā)引用更新 真正開(kāi)始進(jìn)行引用更新操作
    8.最終引用更新 解決了堆中的引用更新后, 還要修正存在于GC Roots中的引用 暫停用戶線程
    9.并發(fā)清理

轉(zhuǎn)發(fā)指針 Brooks pointer

image.png

原有對(duì)象布局結(jié)構(gòu)的最前面統(tǒng)一增加一個(gè)新的引用字段涂臣, 在正常不處于并發(fā)移動(dòng)的情況下盾计, 該引用指向?qū)ο笞约?/em>

ZGC收集器

ZGC收集器是一款基于Region內(nèi)存布局的售担, (暫時(shí))不設(shè)分代的, 使用了讀屏障署辉、 染色指針和內(nèi)存多重映射等技術(shù)來(lái)實(shí)現(xiàn)可并發(fā)的標(biāo)記-整理算法的族铆, 以低延遲為首要目標(biāo)的一款垃圾收集器。
ZGC雖然也是基于Region收集哭尝,但其將Region劃分為了大哥攘、中、小3類容量

image.png

大型Region存放的是4Mb及以上大小的對(duì)象材鹦,容量不固定逝淹,每個(gè)Region只存放一個(gè)大型對(duì)象,同時(shí)該Region中的對(duì)象不會(huì)重分配
染色指針
ZGC收集器采用染色指針使得一旦某個(gè)Region的存活對(duì)象被移走之后桶唐, 這個(gè)Region立即就能夠被釋放和重用掉栅葡, 而不必等待整個(gè)堆中所有指向該Region的引用都被修正后才能清理。
ZGC分為以下四個(gè)階段:
1.并發(fā)標(biāo)記
與G1莽红、 Shenandoah不同的是妥畏, ZGC的標(biāo)記是在指針上而不是在對(duì)象上進(jìn)行的
2.并發(fā)預(yù)備重分配
根據(jù)特定的查詢條件統(tǒng)計(jì)得出本次收集過(guò)程要清理哪些Region, 將這些Region組成重分配集(Relocation Set)
3.并發(fā)重分配
重分配是ZGC執(zhí)行過(guò)程中的核心階段安吁, 這個(gè)過(guò)程要把重分配集中的存活對(duì)象復(fù)制到新的Region上醉蚁, 并為重分配集中的每個(gè)Region維護(hù)一個(gè)轉(zhuǎn)發(fā)表(ForwardTable) , 記錄從舊對(duì)象到新對(duì)象的轉(zhuǎn)向關(guān)系
4.并發(fā)重映射
重映射所做的就是修正整個(gè)堆中指向重分配集中舊對(duì)象的所有引用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼店,一起剝皮案震驚了整個(gè)濱河市网棍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妇智,老刑警劉巖滥玷,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異巍棱,居然都是意外死亡惑畴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門航徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)如贷,“玉大人,你說(shuō)我怎么就攤上這事到踏「芨ぃ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵窝稿,是天一觀的道長(zhǎng)楣富。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伴榔,這世上最難降的妖魔是什么纹蝴? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任庄萎,我火速辦了婚禮,結(jié)果婚禮上塘安,老公的妹妹穿的比我還像新娘惨恭。我一直安慰自己,他們只是感情好耙旦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布脱羡。 她就那樣靜靜地躺著,像睡著了一般免都。 火紅的嫁衣襯著肌膚如雪锉罐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天绕娘,我揣著相機(jī)與錄音脓规,去河邊找鬼。 笑死险领,一個(gè)胖子當(dāng)著我的面吹牛侨舆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绢陌,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挨下,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了脐湾?” 一聲冷哼從身側(cè)響起臭笆,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秤掌,沒(méi)想到半個(gè)月后愁铺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻鉴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年茵乱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孟岛。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓶竭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚀苛,到底是詐尸還是另有隱情在验,我是刑警寧澤玷氏,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布堵未,位于F島的核電站,受9級(jí)特大地震影響盏触,放射性物質(zhì)發(fā)生泄漏渗蟹。R本人自食惡果不足惜块饺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雌芽。 院中可真熱鬧授艰,春花似錦、人聲如沸世落。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屉佳。三九已至谷朝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間武花,已是汗流浹背圆凰。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留体箕,地道東北人专钉。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像累铅,于是被迫代替她去往敵國(guó)和親跃须。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 上一篇JVM垃圾收集器與內(nèi)存分配策略(一)娃兽,下面是jdk1.7版本的垃圾收集器之間的關(guān)系回怜,其中連線兩端的兩種垃圾收...
    零點(diǎn)145閱讀 273評(píng)論 0 0
  • 如果說(shuō)收集算法是內(nèi)存回收的方法論,那垃圾收集器就是內(nèi)存回收的實(shí)踐者换薄∮裎恚《Java虛擬機(jī)規(guī)范》中對(duì)垃圾收集器應(yīng)該如何實(shí)...
    tracy_668閱讀 423評(píng)論 0 0
  • 今天這篇文章本來(lái)要寫LinkedList的,為了準(zhǔn)備面試最近在看垃圾收集器轻要。臨時(shí)變成介紹垃圾收集器啦复旬,這篇文章會(huì)有...
    帶魚真好吃閱讀 1,754評(píng)論 2 3
  • Serial收集器內(nèi)容精講 簡(jiǎn)介:serial垃圾收集器講解 hashMap list,hashcode 是什么冲泥?...
    日落_3d9f閱讀 129評(píng)論 0 1
  • 背景:看完《深入理解Java虛擬機(jī)》和相關(guān)博客驹碍,對(duì)JVM還是沒(méi)有一個(gè)條理清晰的認(rèn)識(shí),遂提取了書中相關(guān)知識(shí)點(diǎn)和參考相...
    LandHu閱讀 1,190評(píng)論 0 1