关于 G1(Garbage First)垃圾收集器
文章目錄
- G1收集器
- 概念
- 設(shè)計(jì)思路
- 設(shè)計(jì)原理
- 執(zhí)行步驟:
G1收集器
概念
G1(Garbage First)是一款主要面向服務(wù)端應(yīng)用的垃圾收集器,JDK 9發(fā)布之日,G1宣告取代ParallelScavenge加Parallel Old組合,成為服務(wù)端模式下的默認(rèn)垃圾收集器,而CMS則淪落至被聲明為不推薦使用(Deprecate)的收集器。
G1收集器是垃圾收集器技術(shù)發(fā)展歷史上的里程碑式的成果,它開創(chuàng)了收集器面向局部收集的設(shè)計(jì)思路和基于Region的內(nèi)存布局形式。
設(shè)計(jì)思路
雖然G1也仍是遵循分代收集理論設(shè)計(jì)的,但其堆內(nèi)存的布局與其他收集器有非常明顯的差異:
- G1不再堅(jiān)持固定大小以及固定數(shù)量的分代區(qū)域劃分,而是把連續(xù)的Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region),每一個(gè)Region都可以根據(jù)需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。
收集器能夠?qū)Π缪莶煌巧腞egion采用不同的策略去處理,這樣無(wú)論是新創(chuàng)建的對(duì)象還是已經(jīng)存活了一段時(shí)間、熬過(guò)多次收集的舊對(duì)象都能獲取很好的收集效果。
設(shè)計(jì)原理
Region中還有一類特殊的Humongous區(qū)域,專門用來(lái)存儲(chǔ)大對(duì)象。G1認(rèn)為只要大小超過(guò)了一個(gè)Region容量一半的對(duì)象即可判定為大對(duì)象。
每個(gè)Region的大小可以通過(guò)參數(shù) -XX:G1HeapRegionSize設(shè)定,取值范圍為1MB~32MB,且應(yīng)為2的N次冪。
而對(duì)于那些超過(guò)了整個(gè)Region容量的超級(jí)大對(duì)象,將會(huì)被存放在N個(gè)連續(xù)的 Humongous Region 之中,G1的大多數(shù)行為都把 Humongous Region 作為老年代的一部分來(lái)進(jìn)行看待
如下圖所示:
雖然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它們都是一系列區(qū)域(不需要連續(xù))的動(dòng)態(tài)集合。
G1收集器之所以能建立可預(yù)測(cè)的停頓時(shí)間模型,是因?yàn)樗鼘egion作為單次回收的最小單元,即每次收集到的內(nèi)存空間都是Region大小的整數(shù)倍,這樣可以有計(jì)劃地避免在整個(gè)Java堆中進(jìn)行全區(qū)域的垃圾收集。
更具體的處理思路是讓G1收集器去跟蹤各個(gè)Region里面的垃圾堆積的“價(jià)值”大小,價(jià)值即回收所獲得的空間大小以及回收所需時(shí)間的經(jīng)驗(yàn)值,然后在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次根據(jù)用戶設(shè)定允許的收集停頓時(shí)間(使用參數(shù)-XX:MaxGCPauseMillis指定,默認(rèn)值是200毫秒),優(yōu)先處理回收價(jià)值收益最大的那些Region,這也就是“Garbage First”名字的由來(lái)。這種使用Region劃分內(nèi)存空間,以及具有優(yōu)先級(jí)的區(qū)域回收方式,保證了G1收集器在有限的時(shí)間內(nèi)獲取盡可能高的收集效率。
執(zhí)行步驟:
如果我們不去計(jì)算用戶線程運(yùn)行過(guò)程中的動(dòng)作,G1收集器的運(yùn)作過(guò)程大致可劃分為以下四個(gè)步驟:
- 初始標(biāo)記: 僅僅是標(biāo)記一些GC Roots能直接關(guān)聯(lián)到的對(duì)象,并且修改TAMS指針的值,讓下一階段用戶線程并發(fā)運(yùn)行時(shí),能正確地在可用的Region中分配新的對(duì)象。
- 并發(fā)標(biāo)記: 從GC Roots開始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,遞歸掃描整個(gè)堆里的對(duì)象圖,找出要回收的對(duì)象,與用戶線程并發(fā)執(zhí)行。
- 最終標(biāo)記: 對(duì)用戶線程做另一個(gè)短暫的暫停,用于處理并發(fā)階段結(jié)束后仍遺留下來(lái)的最后那少量的SATB記錄。
- 篩選回收: 負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)量,對(duì)各個(gè)Region進(jìn)行回收價(jià)值和成本排序,根據(jù)用戶期望的停頓時(shí)間制定回收計(jì)劃,然后把決定回收的那一部分Region的存活對(duì)象復(fù)制到空的Region中,再清理掉整個(gè)舊的Region的全部空間。
下面是G1收集器的運(yùn)行示意圖:
總結(jié)
以上是生活随笔為你收集整理的关于 G1(Garbage First)垃圾收集器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【pyecharts50例】带阴影效果折
- 下一篇: 【SpringBoot】65、Sprin