溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

[JVM 相關(guān)] Java 新型垃圾回收器(Garbage First,G1)

發(fā)布時(shí)間:2020-06-20 12:11:23 來源:網(wǎng)絡(luò) 閱讀:297 作者:zhangpan0614 欄目:編程語言
回顧傳統(tǒng)垃圾回收器
  • HotSpot 垃圾收集器實(shí)現(xiàn)

    • Serial Collector(串型收集器)

    使用場(chǎng)景,大多數(shù)服務(wù)器是單核CPU。

    適用收集場(chǎng)景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)

    • Parallel Conllector(并行收集器)

    又叫吞吐量收集器(throughput collector)應(yīng)用于多核系統(tǒng)。

    適用收集場(chǎng)景:1. 新生代收集是并行處理。2. 老年代收集和Serial Collector一樣。

    • Parallel Compacting Collector(并行壓縮收集器)

    The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection.

    Note : Eventually, the parallel compacting collector will replace the parallel collector.

    上述文字中斜體文字告訴我們,這個(gè)收集器和上一個(gè)并行收集器唯一的不同是在老年代使用了新的算法。

    適用收集場(chǎng)景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)

    • Concurrent Mark-Sweep (CMS) Collector (并發(fā)標(biāo)記清除)

    Young generation collections 通常不會(huì)造成長(zhǎng)時(shí)間停頓,然而old generation collections卻是是造成長(zhǎng)時(shí)間停頓的,雖然它不長(zhǎng)出現(xiàn),特別是在大的heaps回收被涉及到的時(shí)候。為了處理這個(gè)問題,HotSpot JVM 引入了一個(gè)叫做 concurrent mark-sweep(CMS) collector,通常也被稱為低延時(shí)收集器low-latency collector.

    適用場(chǎng)景: 僅適用于老年代,新生代處理方式和Parallel Collector相同。

G1目標(biāo)

G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 計(jì)劃將G1作為CMS收集器的長(zhǎng)久替代物。

它是為了平衡 延時(shí)和吞吐量之間的一種最優(yōu)關(guān)系。

G1實(shí)現(xiàn)原理
基本屬性
和CMS的相同點(diǎn)
  • CMS Replacement(CMS替代物)
  • Server 'Style' Garbage Collector(服務(wù)端垃圾收集器-內(nèi)存,核數(shù)區(qū)別)
  • Parallel 并行
  • Concurrent 并發(fā)
  • Generational 分代
和CMS的主要區(qū)別
  • Good Throughput 良好的吞吐量
  • Compacting 壓縮
  • Improved ease-of-use 提升了易用性(更多的JVM參數(shù)可用)
  • Predictable(though not hard real-time) 可預(yù)估的,非絕對(duì)實(shí)時(shí)。
基本概念
  • G1 堆布局

G1將堆分成若干固定大小的Region/區(qū)域(區(qū)域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一個(gè)無需連續(xù)的區(qū)域集合,每一個(gè)區(qū)域獨(dú)立進(jìn)行內(nèi)存的分配和回收,區(qū)域是內(nèi)存管理的基本單元,在某一個(gè)時(shí)間節(jié)點(diǎn),可能是空閑的,當(dāng)內(nèi)存被請(qǐng)求時(shí),內(nèi)存管理器將空閑的Region分配到某個(gè)分代,然后歸還應(yīng)用分配給的空間。

大多數(shù)情況下,GC的操作同一時(shí)間只會(huì)在一個(gè)區(qū)域進(jìn)行。

  • Region 分布

    超大對(duì)象(Humongous Objects)

    下圖中跨區(qū)域的灰色模塊即代表了超大對(duì)象,超大對(duì)象是指那些空間大小 >=1/2 個(gè)區(qū)域空間的對(duì)象.超大對(duì)象有時(shí)候會(huì)被以下特殊方式處理:

    • 每個(gè)超大對(duì)象在老年代區(qū)域中的連續(xù)區(qū)域分配。對(duì)象分配起始于在連續(xù)區(qū)域中的首個(gè)成員,如果連續(xù)區(qū)域中的最后一個(gè)區(qū)域存在剩余空間的話,那么該空間將失去分配的機(jī)會(huì),直到其關(guān)聯(lián)的超大對(duì)象被完全回收
    • 超大對(duì)象的回收通常僅在Cleanup停頓中的Marking結(jié)束后、或者在Full GC時(shí)。
    • 超大對(duì)象的分配可能造成垃圾收集停頓過早地發(fā)生(主要是因?yàn)榭臻g浪費(fèi)。)
    • 超大對(duì)象絕不會(huì)發(fā)生移動(dòng),即使在沒有Full GC的情況下

[JVM 相關(guān)] Java 新型垃圾回收器(Garbage First,G1)

  • 回收周期

    • Young-only

    Young-only 階段的垃圾 收集 時(shí)逐漸地將老年代的對(duì)象填充到當(dāng)前可用的內(nèi)存。即將可以提升的新生代對(duì)象提升到老年代。

    該階段開始于Young-only的 收集 動(dòng)作,也就是下圖中的藍(lán)色小球,每一個(gè)小球都是一次收集動(dòng)作,也就是提升對(duì)象到老年代。Young-only 與Space-reclamation 過渡實(shí)際上是開始于老年代空間 *占用* 達(dá)到某個(gè)閾值,即Heap初始化占用閾值。此時(shí),G1將調(diào)度Initial Mark的Young-only收集(藍(lán)色大球),而非常規(guī)的Young-only(藍(lán)色小球)收集。

    • Initial Mark

      此類收集開始于標(biāo)記過程,附帶一個(gè)常規(guī)的Young-only收集,并發(fā)標(biāo)記決定所有在老年代區(qū)域中可達(dá)的存活對(duì)象是否要遺留到Space-reclamation 階段。當(dāng)標(biāo)記過程未結(jié)束時(shí),常規(guī)的Young-only 收集可能已經(jīng)發(fā)生,等到標(biāo)記完成時(shí),將伴隨著兩個(gè)特殊的Stop-The-World停頓,RemarkCleanUp.

    • Remark 停頓

      因?yàn)樵?code>Initial Mark標(biāo)記過程中,因?yàn)樗遣l(fā)執(zhí)行,有可能會(huì)發(fā)生Young-only收集,造成標(biāo)記數(shù)據(jù)有誤差,因此需要重新標(biāo)記一次,該過程為串行執(zhí)行,會(huì)造成Stop-The-World.

      在Remark 和Cleanup之間,G1將并發(fā)地計(jì)算出一份對(duì)象存活性總結(jié)報(bào)告,它將在Cleanup停頓階段更新內(nèi)部的數(shù)據(jù)結(jié)構(gòu)

    • Cleanup 停頓

      該停頓同樣將完整的回收空閑區(qū)域,并且決定Space-reclamation階段是否需要繼續(xù)跟蹤,如果繼續(xù)跟隨的話,Young-only階段的完成僅僅做Young-only收集動(dòng)作。

    • Space-reclamation

    Space-reclamation(空間回收/復(fù)用)階段是回收老年代空間,同時(shí)處理新生代。

    這個(gè)階段由多個(gè)混合的收集動(dòng)作組成,不僅包含新生代區(qū)域,同時(shí)也會(huì)排除老年代區(qū)域的存活對(duì)象,當(dāng)G1發(fā)覺依然無法滿足空閑的空間請(qǐng)求時(shí),G1會(huì)終止本階段。如果應(yīng)用消耗完內(nèi)存,G1將執(zhí)行Stop-The-World的全堆壓縮(Full GC)。

    如下圖所示:

    <img src ="https://i.loli.net/2019/08/05/ZMTmN25FohfBkJw.png" width="400" >

    2種過程是循環(huán)往復(fù)收集。

G1指令細(xì)節(jié)
初始空間占用

Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集觸發(fā)的閾值,為老年代空間定義Heap占用的百分比。

JVM 設(shè)置參數(shù):-XX:InitiatingHeapOccupancyPercent

默認(rèn)情況下,根據(jù)標(biāo)記時(shí)間以及老年代在標(biāo)記周期中的內(nèi)存分配,G1垃圾收集器將自動(dòng)抉擇理想的IHOP的值。

JVM 失效參數(shù):-XX:-G1UseAdaptiveIHOP

修改區(qū)域空間大小

-XX:G1HeapRegionSize

[JVM 相關(guān)] Java 新型垃圾回收器(Garbage First,G1)

G1 Vs. 傳統(tǒng)垃圾回收器
  • G1 不區(qū)分新/老生代,只區(qū)分Region

  • G1 收集分2個(gè)階段Young-onlySpace-reclamation
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI