0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM入門(mén)之歷代垃圾回收器 2

jf_78858299 ? 來(lái)源:北洋洋洋 ? 作者:北洋 ? 2023-02-10 11:29 ? 次閱讀

CMS收集器

全稱(chēng):Concurrent Mark Sweep

特點(diǎn)

  1. 「采用標(biāo)記-清除算法實(shí)現(xiàn)」 2.和Parallel 系列的收集器注重點(diǎn)不同:
Parallel 注重吞吐量CMS注重STW的停頓時(shí)間

工作流程

1.初始標(biāo)記

「CMS inital mark」

?

標(biāo)記GC Roots直接關(guān)聯(lián)的對(duì)象**「需要STW」**

?

2.并發(fā)標(biāo)記

CMS concurrent mark

?

根據(jù)上一步和GC Roots直接關(guān)聯(lián)的對(duì)象進(jìn)行遍歷整個(gè)堆里面的對(duì)象圖并進(jìn)行標(biāo)記,由于是并發(fā)的所以并 「不需要停頓用戶(hù)線程」 ,但是比較耗時(shí)因?yàn)楸闅v整個(gè)對(duì)象圖。

?

3.重新標(biāo)記

CMS remark

?

在并發(fā)標(biāo)記期間由于和用戶(hù)線程是并發(fā)的,所以這段期間用戶(hù)線程可能更新了引用,所以需要進(jìn)行一次修正(詳見(jiàn)上一篇文章中講到的 「增量更新」 ) 需要 「STW」 ,STW停頓時(shí)間比初始標(biāo)記時(shí)間長(zhǎng),但是并沒(méi)有并發(fā)標(biāo)記運(yùn)行時(shí)間長(zhǎng)

?

4.并發(fā)清除

?

清除刪掉被標(biāo)記為垃圾的對(duì)象,由于采用的是標(biāo)記-清除算法,所以并不需要移動(dòng)存活對(duì)象因此是可以并發(fā)的。(當(dāng)內(nèi)存碎片嚴(yán)重到不足以分配對(duì)象時(shí)其實(shí)還是需要進(jìn)行標(biāo)記-整理算法的,這個(gè)時(shí)候就會(huì)提前觸發(fā)FullGC。)

?

「注意」 :在并發(fā)階段產(chǎn)生的**“浮動(dòng)垃圾”**(并發(fā)時(shí)用戶(hù)線程產(chǎn)生的垃圾),需要等到下一次垃圾回收才能進(jìn)行清理;而且并發(fā)的時(shí)候需要預(yù)留一部分內(nèi)存空間供用戶(hù)線程使用,所以不能等到老年代完全用完在進(jìn)行清理。JDK5的默認(rèn)設(shè)置是當(dāng)老年代使用了65%的空間就會(huì)觸發(fā)GC。

G1 收集器

特點(diǎn)

思維方式的重大轉(zhuǎn)變:

?

G1之前的收集器都是分代收集的思想,根據(jù)不同的代采用不同的GC:新生代(Minor GC),老年代(Major GC),整個(gè)JAVA堆(Full GC)。

?

但是GC是根據(jù)哪塊內(nèi)存中垃圾數(shù)量多回收效益最大來(lái)區(qū)分的,面向的是堆內(nèi)存中的任意一塊內(nèi)存來(lái)組成回收集(Collection Set)進(jìn)行回收。

實(shí)現(xiàn)

?

基于Region的堆內(nèi)存布局來(lái)實(shí)現(xiàn)該回收過(guò)程。不再以固定大小及固定數(shù)量來(lái)劃分分代區(qū)域,而是把連續(xù)的堆內(nèi)存區(qū)域進(jìn)行劃分為各自獨(dú)立大小相等的區(qū)域(Region),每一個(gè)Region都可以根據(jù)需要扮演新生代中的Enen空間,Survivor空間,或者老年代。收集器根據(jù)扮演不同角色的Region采用不同策略去處理。

?

Region中有一類(lèi)特殊的Humongous區(qū)域,專(zhuān)門(mén)用來(lái)存儲(chǔ)大對(duì)象。

G1認(rèn)為一個(gè)對(duì)象的大小超過(guò)了一個(gè)Region空間的一半就認(rèn)為該對(duì)象是大對(duì)象,如果超過(guò)了整個(gè)Region空間的超大對(duì)象將會(huì)被存放在連續(xù)的Humongous Region中,因此該區(qū)域一般會(huì)被作為老年代看待。

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

「1.建立可預(yù)測(cè)的停頓時(shí)間模型」 :由于采用的是Region,因此回收單元作為Region即每次回收都是Region大小的整數(shù)倍。

G1會(huì)跟蹤Region區(qū)域里面垃圾堆,計(jì)算出價(jià)值(回收所獲得的空間大小以及回收所需時(shí)間的經(jīng)驗(yàn)值),接著在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,根據(jù)用戶(hù)設(shè)置的允許停頓時(shí)間來(lái)進(jìn)行回收價(jià)值最大的Region區(qū)域。也就是“Garbage First” 的由來(lái)。

「2.內(nèi)存碎片」 整體上采用的是標(biāo)記-整理,但是在兩個(gè)Region中實(shí)際上還是采用的復(fù)制算法,所以不會(huì)出現(xiàn)內(nèi)存碎片問(wèn)題。

缺點(diǎn)

「1.浪費(fèi)額外內(nèi)存來(lái)維護(hù)收集器工作」

跨代引用避免全堆掃描之前說(shuō)過(guò)是采用 「記憶集」 的方式來(lái)解決,在G1中也一樣。每個(gè)Region中都有自己的記憶集 「但是」 在G1中每個(gè)Region除了需要記錄別的Region指向自己的指針,還需要標(biāo)記這些指針?lè)謩e在哪些卡頁(yè)范圍內(nèi)。其實(shí)本質(zhì)上說(shuō)是哈希表,Key是別的Region的起始地址,Value是一個(gè)集合存儲(chǔ)的元素是卡表的索引號(hào)。因此實(shí)現(xiàn)起來(lái)比原有的記憶集要復(fù)雜,而且Region的數(shù)量比之前的分代數(shù)量要多得多,所以記憶集的維護(hù)占用了更高的內(nèi)存

?

G1至少要耗費(fèi)大約相當(dāng)于JAVA堆容量的10%到20%來(lái)存儲(chǔ)維持收集器正常工作

?

「2.不僅用到寫(xiě)后屏障還用到了寫(xiě)前屏障」

上一小點(diǎn)中已經(jīng)講到維護(hù)卡表是需要進(jìn)行添加寫(xiě)后屏障來(lái)完成更新卡表的操作的,但是G1還用到了寫(xiě)前屏障:由于使用的是原始快照來(lái)保證可以進(jìn)行并發(fā)標(biāo)記的基礎(chǔ),對(duì)比與增量更新來(lái)說(shuō)雖然能夠減少最終標(biāo)記的停頓時(shí)間,但是相比于收集器,這款收集器不僅采用了寫(xiě)前屏障也采用了寫(xiě)后屏障導(dǎo)致最終的效率降低

工作流程

與之前不同的是 「最后一處」 ,這個(gè)步驟需要進(jìn)行 「更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)所有的Region的回收價(jià)值和成本進(jìn)行排序,然后根據(jù)用戶(hù)設(shè)定的期望停頓時(shí)間進(jìn)行決定選擇哪幾個(gè)Region構(gòu)成回收集,然后將一部分的Region中存活對(duì)象復(fù)制到另外一個(gè)空的Region空間中,隨后進(jìn)行清理掉整個(gè)舊的Region空間」 。是不是復(fù)制算法(針對(duì)與Region來(lái)說(shuō)),因?yàn)樯婕皩?duì)象移動(dòng),所以需要 「暫停用戶(hù)線程」 。

總結(jié)

到此,如果讀者之前閱讀過(guò)筆者之前的關(guān)于垃圾回收器講解的文章,其實(shí)已經(jīng)對(duì)現(xiàn)在大多數(shù)垃圾回收器機(jī)制和實(shí)現(xiàn)原理了解的差不多了,讀者有興趣可以自行去看Shenandoah收集器和ZGC收集器,本文不在敘述,主要確實(shí)文章內(nèi)容有點(diǎn)太長(zhǎng)了哈哈。后面的文章將不在分析垃圾回收器的知識(shí),但是還是會(huì)更新關(guān)于JVM的文章。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • GC
    GC
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    17069
  • cms
    cms
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10940
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    157

    瀏覽量

    12188
  • 收集器
    +關(guān)注

    關(guān)注

    0

    文章

    30

    瀏覽量

    3117
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    固態(tài)硬盤(pán)垃圾回收方法

    由于NAND閃存的固有限制,寫(xiě)前擦除和擦除粒度較大,基于NAND Flash的固態(tài)硬盤(pán)(SSD)需要執(zhí)行垃圾回收以重用失效頁(yè)。然而垃圾回收帶來(lái)的高開(kāi)銷(xiāo)會(huì)顯著降低SSD的性能,也會(huì)直接影
    發(fā)表于 12-03 10:50 ?2次下載
    固態(tài)硬盤(pán)<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法

    Jvm垃圾回收機(jī)制及性能調(diào)優(yōu)實(shí)戰(zhàn)

    JVM中自動(dòng)檢測(cè)并移除不再使用的數(shù)據(jù)對(duì)象的這種機(jī)制稱(chēng)為:垃圾回收,簡(jiǎn)稱(chēng)GC。JVM通過(guò)使用垃圾收集
    發(fā)表于 04-03 14:31 ?2次下載

    帶顏色的JVM垃圾回收三色標(biāo)記法

    三色標(biāo)記法是一種垃圾回收法,它可以讓JVM不發(fā)生或僅短時(shí)間發(fā)生STW(Stop The World),從而達(dá)到清除JVM內(nèi)存垃圾的目的。
    的頭像 發(fā)表于 10-20 14:23 ?1573次閱讀

    詳解JVM垃圾回收算法和垃圾回收

    JVM 垃圾回收機(jī)制是對(duì)堆中沒(méi)有使用的對(duì)象進(jìn)行回收,那么判斷對(duì)象是否“存活”就至關(guān)重要。在判斷對(duì)象是否“存活”的方法中,我們會(huì)介紹引用計(jì)數(shù)算法和可達(dá)性分析法。
    的頭像 發(fā)表于 03-29 13:55 ?1439次閱讀
    詳解<b class='flag-5'>JVM</b>的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>器</b>

    JVM入門(mén)歷代垃圾回收 1

    很多人經(jīng)常把這兩個(gè)搞混,當(dāng)然筆者剛開(kāi)始的時(shí)候也是傻傻分不清楚。其實(shí)只要記住并行說(shuō)的是GC 線程之間的關(guān)系,而并發(fā)說(shuō)的是GC和用戶(hù)線程之間的關(guān)系
    的頭像 發(fā)表于 02-10 11:29 ?576次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>之</b><b class='flag-5'>歷代</b><b class='flag-5'>垃圾</b><b class='flag-5'>回收</b><b class='flag-5'>器</b> 1

    JVM入門(mén)關(guān)于GC的擴(kuò)展知識(shí)1

    本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以?xún)?yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?523次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>之</b>關(guān)于GC的擴(kuò)展知識(shí)1

    JVM入門(mén)關(guān)于GC的擴(kuò)展知識(shí)2

    本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以?xún)?yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?529次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>之</b>關(guān)于GC的擴(kuò)展知識(shí)<b class='flag-5'>2</b>

    JVM入門(mén)垃圾回收算法

    根據(jù)如何判定對(duì)象是垃圾,垃圾回收算法分為兩類(lèi):1、 「引用計(jì)數(shù)式垃圾收集」 (判定垃圾是通過(guò)引用計(jì)數(shù)
    的頭像 發(fā)表于 02-10 11:40 ?733次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>之</b><b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    詳細(xì)解析JVM中的垃圾回收機(jī)制

    Java語(yǔ)言的一大優(yōu)勢(shì)在于其具有自動(dòng)垃圾回收(Garbage Collection,GC)機(jī)制,讓開(kāi)發(fā)者無(wú)需關(guān)心內(nèi)存的分配與釋放。
    的頭像 發(fā)表于 06-06 16:53 ?1918次閱讀

    垃圾收集JVM參數(shù)配置

    本篇文章我們就來(lái)給大家介紹垃圾收集JVM 參數(shù)配置。 JVM參數(shù)有很多,其實(shí)我們直接使用默認(rèn)的JVM參數(shù),不去修改都可以滿(mǎn)足大多數(shù)情況
    的頭像 發(fā)表于 10-09 16:35 ?502次閱讀
    <b class='flag-5'>垃圾</b>收集<b class='flag-5'>器</b>的<b class='flag-5'>JVM</b>參數(shù)配置

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    初始分配的堆內(nèi)存大小。例如,-Xms512m表示將初始堆大小設(shè)置為512MB。 -Xmx:設(shè)置JVM最大可分配的堆內(nèi)存大小。例如,-Xmx2g表示將最大堆大小設(shè)置為2GB。 -Xmn:設(shè)置年輕代的大小
    的頭像 發(fā)表于 12-05 11:36 ?1252次閱讀

    jvm配置的mx

    用于設(shè)置JVM的最大堆內(nèi)存大小,即堆的上限。當(dāng)堆內(nèi)存不足時(shí),JVM會(huì)觸發(fā)垃圾回收機(jī)制以釋放內(nèi)存。如果垃圾
    的頭像 發(fā)表于 12-05 14:24 ?634次閱讀

    智能垃圾回收箱控制系統(tǒng)硬件設(shè)計(jì)

    身份識(shí)別;身份驗(yàn)證后,控制啟動(dòng)電機(jī)打開(kāi)回收門(mén),持續(xù)開(kāi)啟7秒;用戶(hù)投放垃圾后,回收門(mén)自動(dòng)關(guān)閉。超聲波模塊檢測(cè)桶內(nèi)垃圾容量,超過(guò)設(shè)定值時(shí),控制
    的頭像 發(fā)表于 04-13 08:10 ?718次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱控制系統(tǒng)硬件設(shè)計(jì)

    智能垃圾回收箱功能實(shí)驗(yàn)

    過(guò)程中,會(huì)涉及到回收箱的語(yǔ)音播報(bào)模塊,電機(jī)驅(qū)動(dòng)模塊,超聲波傳感模塊,垃圾稱(chēng)重模塊,無(wú)線數(shù)據(jù)傳輸模塊等。2語(yǔ)音播報(bào)模塊的試驗(yàn)語(yǔ)音播報(bào)模塊的主要功能是播放“垃圾分類(lèi),家園更美
    的頭像 發(fā)表于 05-24 08:10 ?359次閱讀
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱功能實(shí)驗(yàn)

    從原理聊JVM(一):染色標(biāo)記和垃圾回收算法

    導(dǎo)讀 JAVA簡(jiǎn)單易用的特性,能夠讓研發(fā)人員在不了解JVM的底層運(yùn)行機(jī)制的情況下依舊能夠編寫(xiě)出功能完善的代碼。 但是對(duì)JVM的理解,是一個(gè)程序員普通和優(yōu)秀的分水嶺。全面地了解JVM的工作原理,能夠
    的頭像 發(fā)表于 08-20 15:25 ?139次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標(biāo)記和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法