日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JVM 經(jīng)典垃圾收集器 —— CMS 收集器和 G1 收集器

 頭號(hào)碼甲 2021-06-07

本文部分摘自《深入理解 Java 虛擬機(jī)第三版》


CMS 收集器

1. 概述

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。由于大部分 Java 應(yīng)用主要集中在互聯(lián)網(wǎng)網(wǎng)站以及基于瀏覽器的 B/S 系統(tǒng)的服務(wù)端,這類應(yīng)用通常會(huì)較為關(guān)注服務(wù)的響應(yīng)速度,希望系統(tǒng)的停頓時(shí)間盡可能少,CMS 收集器就非常符合這類應(yīng)用的需求

2. 步驟

從名字可以知道,CMS 收集器是基于標(biāo)記 - 清除算法實(shí)現(xiàn)的,它的運(yùn)作過(guò)程分為四個(gè)步驟:

  1. 初始標(biāo)記(CMS initial mark)

    僅僅只是標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)到的對(duì)象,速度很快,需要 Stop The World

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

    就是從 GC Roots 的直接關(guān)聯(lián)對(duì)象開(kāi)始遍歷整個(gè)對(duì)象圖的過(guò)程,耗時(shí)較長(zhǎng),但不需要停頓用戶線程,可與垃圾收集器線程一起并發(fā)執(zhí)行

  3. 重新標(biāo)記(CMS remark)

    該階段是為了修正并發(fā)標(biāo)記期間,因用戶程序運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段需要 Stop The World,而且停頓時(shí)間通常比初始階段稍長(zhǎng)一些,但也遠(yuǎn)比并發(fā)標(biāo)記階段的時(shí)間短

  4. 并發(fā)清除(CMS concurrent sweep)

    清理刪除掉標(biāo)記階段判斷已經(jīng)死亡的對(duì)象,由于不需要移動(dòng)存活對(duì)象,所有這個(gè)階段可以和用戶線程并發(fā)執(zhí)行

由于整個(gè)過(guò)程中耗時(shí)最長(zhǎng)的是并發(fā)標(biāo)記和并發(fā)清除階段,而這兩個(gè)階段都可以和用戶線程并發(fā)執(zhí)行,所以從總體上看,CMS 收集器內(nèi)存回收過(guò)程是與用戶線程一起并發(fā)執(zhí)行的

3. CMS 收集器的不足

CMS 收集器的主要優(yōu)點(diǎn)就是:并發(fā)收集、低停頓,因此也稱 CMS 收集器為并發(fā)低停頓收集器。但 CMS 還遠(yuǎn)未達(dá)到完美的程度,它至少有以下四個(gè)明顯的缺點(diǎn):

  1. 對(duì)處理器資源非常敏感

    在并發(fā)階段,CMS 雖然不會(huì)導(dǎo)致用戶線程停頓,但卻會(huì)因?yàn)檎加昧艘徊糠志€程(或者說(shuō)是處理器的計(jì)算能力)而導(dǎo)致應(yīng)用程序變慢,降低吞吐量。處理器核心數(shù)在四個(gè)或以上那還好,如果不足四個(gè),CMS 會(huì)占用將近一半的運(yùn)算能力去執(zhí)行收集器線程,這將導(dǎo)致用戶程序的執(zhí)行效率大幅降低

  2. 無(wú)法處理浮動(dòng)垃圾

    在 CMS 的并發(fā)標(biāo)記和并發(fā)清理階段,由于用戶線程繼續(xù)運(yùn)行,因此有可能會(huì)有新的垃圾對(duì)象產(chǎn)生。但這一部分垃圾對(duì)象是出現(xiàn)在標(biāo)記結(jié)束之后,CMS 無(wú)法在當(dāng)次收集中處理掉它們,只能留待下一次垃圾收集在清理,這一部分垃圾就稱為浮動(dòng)垃圾

  3. 可能會(huì)出現(xiàn)并發(fā)失敗

    同樣也是由于垃圾收集階段用戶線程還需持續(xù)執(zhí)行,那就必須預(yù)留足夠的內(nèi)存空間供用戶線程使用。因此 CMS 收集器不能像其他收集器那樣等老年代幾乎完全填滿再進(jìn)行收集,而必須預(yù)留一部分空間供并發(fā)收集時(shí)的程序運(yùn)作使用,這部分空間的大小可以通過(guò) -XX:CMSInitiatingOccu-pancyFraction 參數(shù)來(lái)設(shè)置。如果 CMS 運(yùn)行期間預(yù)留的內(nèi)存無(wú)法滿足程序分配對(duì)象的需要,就會(huì)出現(xiàn)一次并發(fā)失敗,這時(shí)虛擬機(jī)不得不啟用預(yù)備方案:凍結(jié)用戶線程,臨時(shí)啟用 Serial Old 收集器來(lái)重新進(jìn)行老年代的垃圾收集,導(dǎo)致 Stop The World

  4. 大量空間碎片的產(chǎn)生

    CMS 是一款基于標(biāo)記 - 清除算法實(shí)現(xiàn)的收集器,這也意味著收集結(jié)束時(shí)會(huì)產(chǎn)生大量空間碎片。為了解決這個(gè)問(wèn)題,CMS 收集器提供了一個(gè) -XX:+UseCMS-CompactAtFullCollection 開(kāi)關(guān)參數(shù),用于在收集結(jié)束后做一次內(nèi)存整理,以及 -XX:CMSFullGCsBefore-Compaction 參數(shù),要求 CMS 收集器在執(zhí)行若干次不整理空間的 Full GC 之后,下一次 Full GC 前先做一次碎片整理


Garbage First 收集器

1. 概述

Garbage First(G1)收集器是一款主要面向服務(wù)端應(yīng)用的垃圾收集器,開(kāi)創(chuàng)了收集器面向局部收集的設(shè)計(jì)思路和基于 Region 的內(nèi)存布局形式。HotSpot 開(kāi)發(fā)團(tuán)隊(duì)對(duì) G1 收集器的期望就是能在將來(lái)替代 CMS 收集器,所以在 JDK9 發(fā)布之日,G1 便宣告取代 Parallel Scavenge 加 Parallel Old 組合,成為服務(wù)端模式下的默認(rèn)垃圾收集器,而 CMS 則淪為不推薦使用

2. 分區(qū)概念

在過(guò)去,包括 CMS 在內(nèi),垃圾收集的范圍要么是整個(gè)新生代,要么是整個(gè)老年代,再要么是整個(gè) Java 堆。而 G1 可以面向堆內(nèi)存任何部分來(lái)組成回收集(Collection Set,一般簡(jiǎn)稱 CSet)進(jìn)行回收,衡量標(biāo)準(zhǔn)是哪塊內(nèi)存中垃圾數(shù)量最多,回收收益最大,這就是 G1 收集器的 Mixed GC 模式

雖然 G1 也是基于分代收集理論設(shè)計(jì),但其對(duì)內(nèi)存布局與其他收集器有明顯差異。G1 把連續(xù)的 Java 堆劃分成多個(gè)大小相等的獨(dú)立區(qū)域(Region),每一個(gè) Region 可以根據(jù)需要扮演新生代的 Eden 空間、Survivor 空間、老年代空間等等。收集器能對(duì)扮演不同角色的 Region 采用不同的策略處理

Region 中還有一類特殊的 Humongous 區(qū)域,專門用來(lái)存儲(chǔ)大對(duì)象。只要該對(duì)象大小超過(guò)一半的 Region 的容量即可判定為大對(duì)象。而對(duì)于那些超過(guò)整個(gè) Region 容量的超級(jí)大對(duì)象,將會(huì)被存放在 N 個(gè)連續(xù)的 Humongous Region 之中,G1 的大多數(shù)行為都把 Humongous Region 作為老年代的一部分來(lái)看待

3. 停頓時(shí)間模型

停頓時(shí)間模型的意思是能夠支持指定在一個(gè)長(zhǎng)度為 M 毫秒的時(shí)間片段內(nèi),消耗在垃圾收集上的時(shí)間大概率不超過(guò) M 毫秒這么一個(gè)目標(biāo)。G1 收集器作為 CMS 收集器的替代者,自然可以實(shí)現(xiàn)這個(gè)目標(biāo)

G1 之所以能建立起可預(yù)測(cè)的停頓時(shí)間模型,是因?yàn)樗鼘?Region 作為單詞回收的最小單元,即每次收集到的內(nèi)存空間都是 Region 大小的整數(shù)倍,這樣可以有計(jì)劃地避免進(jìn)行全區(qū)域的垃圾收集。G1 收集器還可以跟蹤每個(gè) Region 的垃圾堆積的“價(jià)值”大小,即回收所獲得的空間大小以及所需時(shí)間,并在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次根據(jù)用戶設(shè)置的允許收集停頓時(shí)間(使用 -XX:MaxGCPauseMillis 指定),優(yōu)先處理回收價(jià)值最大的 Region。這種使用 Region 劃分內(nèi)存空間,以及具有優(yōu)先級(jí)的區(qū)域回收方式,保證了 G1 收集器在有限的時(shí)間內(nèi)獲取盡可能高的收集效率

4. 要解決的難點(diǎn)

G1 收集器的設(shè)計(jì)理念看似無(wú)太多驚人之處,其實(shí)有很多關(guān)鍵的細(xì)節(jié)問(wèn)題需要解決:

  • 如何解決跨 Region 引用對(duì)象?

    這個(gè)問(wèn)題的解決思路可以使用之前提到過(guò)的記憶集來(lái)處理,但由于每個(gè) Region 都要維護(hù)自己的記憶集,因此實(shí)現(xiàn)更加復(fù)雜,而且內(nèi)存占用負(fù)擔(dān)也更重

  • 并發(fā)標(biāo)記階段如何保證收集線程與用戶線程互不干擾?

    對(duì)應(yīng)該問(wèn)題,CMS 采用增量更新算法解決,而 G1 采用原始快照算法解題。另外,G1 還為每一個(gè) Region 設(shè)計(jì)了兩個(gè)名為 TAMS(Top At Mark Start)的指針,用于在并發(fā)回收過(guò)程中新對(duì)象的內(nèi)存分配。G1 收集器默認(rèn)在這個(gè)地址以上的對(duì)象是存活的,不會(huì)納入回收范圍

  • 如何建立起可靠的停頓預(yù)測(cè)模型?

    G1 收集器的停頓時(shí)間模型是以衰減均值(Decaying Average)為理論基礎(chǔ)實(shí)現(xiàn)的。衰減均值是指它會(huì)比普通的平均值更容易受新數(shù)據(jù)影響,因此,Region 的統(tǒng)計(jì)狀態(tài)越新,越能決定其回收的價(jià)值

5. 步驟

G1 收集器的運(yùn)作過(guò)程大致可劃分為以下四個(gè)步驟:

  1. 初始標(biāo)記

    僅僅標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)的對(duì)象,并修改 TAMS 指針的值。該階段需停頓線程,但耗時(shí)很短,而且是借進(jìn)行 Minor GC 時(shí)同步完成的,實(shí)際上并沒(méi)有額外的停頓

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

    從 GC Roots 開(kāi)始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,找出要回收對(duì)象。該階段耗時(shí)較長(zhǎng),但可與用戶程序并發(fā)執(zhí)行。當(dāng)掃描完成后,還要重新處理 SATB 記錄下在并發(fā)時(shí)有引用變動(dòng)的對(duì)象

  3. 最終標(biāo)記

    用戶線程短暫暫停,處理并發(fā)階段結(jié)束后遺留下來(lái)的少量 SATB 記錄

  4. 篩選回收

    更新 Region 統(tǒng)計(jì)數(shù)據(jù),對(duì)各個(gè) Region 的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的停頓時(shí)間制定回收計(jì)劃,然后把要回收的那一部分 Region 的存活對(duì)象復(fù)制到空的 Region 中,再清理掉整個(gè)舊 Region 的全部空間。這里涉及到存活對(duì)象的移動(dòng),必須暫停用戶線程

6. G1 和 CMS 的對(duì)比

G1 和 CMS 都非常關(guān)注停頓時(shí)間控制,毫無(wú)疑問(wèn),可以由用戶指定期望的停頓時(shí)間是 G1 收集器的一大殺手锏。G1 收集器經(jīng)常被拿來(lái)和 CMS 收集器比較,從長(zhǎng)遠(yuǎn)來(lái)看,G1 收集器肯定是會(huì)取代 CMS 收集器的

除了更先進(jìn)的設(shè)計(jì)理念,單從傳統(tǒng)的算法理論來(lái)看,G1 從整體來(lái)看是基于標(biāo)記 - 整理算法實(shí)現(xiàn),而從局部來(lái)看(兩個(gè) Region 之間)又是基于標(biāo)記 - 復(fù)制算法實(shí)現(xiàn),這意味著 G1 不會(huì)產(chǎn)生內(nèi)存碎片。但 G1 并非全方面碾壓 CMS,G1 由于其復(fù)雜的內(nèi)部細(xì)節(jié)實(shí)現(xiàn),使得垃圾收集時(shí)的內(nèi)存占用和程序運(yùn)行時(shí)的額外執(zhí)行負(fù)載都要比 CMS 高。使用哪款收集器,往往要針對(duì)具體場(chǎng)景才能做定量比較,目前在小內(nèi)存應(yīng)用上 CMS 的表現(xiàn)大概率會(huì)優(yōu)于 G1,而在大內(nèi)存應(yīng)用上 G1 則占有優(yōu)勢(shì),這個(gè)平衡點(diǎn)通常在 6GB ~ 8GB 之間。當(dāng)然,隨著 HotSpot 開(kāi)發(fā)者對(duì) G1 的持續(xù)優(yōu)化,最終勝利的天平必定回向 G1 傾斜


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多