也談G1垃圾回收器

? ? ? ?目前關(guān)于G1垃圾回收器的相關(guān)介紹很多,最近閱讀了下oracle公司的說(shuō)明,也想談?wù)勛约簩?duì)于G1的理解,如果有不準(zhǔn)確的地方,歡迎指正。


1、堆模型比較

???????虛擬機(jī)內(nèi)存模型主要包括五大塊,分別是虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器,堆方法區(qū)。其中虛擬機(jī)棧、本地方法棧和程序計(jì)數(shù)器都是線程私有的,不存在垃圾回收的問(wèn)題。垃圾回收主要發(fā)生在堆和方法區(qū)上。而方法區(qū)的回收效率低(主要原因在于 方法區(qū)上存放的是編譯后的class信息和常量等,不容易被回收)。因此回收主要發(fā)生在堆上。????

? ? ? ? jvm堆模型在G1出現(xiàn)之前如下圖所示。

傳統(tǒng)垃圾回收器堆模型

????????主要包括三大塊:新生代,老年代和永久代。在hotspot虛擬機(jī)中,永久代是用來(lái)實(shí)現(xiàn)了方法區(qū)。如前所述,在永久代的回收效率并不高。三塊區(qū)域在物料內(nèi)存上是連續(xù)的。

? ? ? ? 新生成的對(duì)象會(huì)分配到新生代,當(dāng)新生代被占滿時(shí),會(huì)通過(guò)Gc將存活的對(duì)象復(fù)制到survivor區(qū),滿足晉升條件的對(duì)象或者survivor不夠時(shí)會(huì)觸發(fā)內(nèi)存擔(dān)保,對(duì)象會(huì)進(jìn)入old Generation。

? ? ? ? 而G1堆模型如下

G1 堆模型

????????G1垃圾回收器不對(duì)堆進(jìn)行連續(xù)切分為三塊,而是將堆切分為一個(gè)更小的緯度: region。每快Region大小是相同的,最小為1M, 最大為32M。一般會(huì)將堆分為2000塊。因此可以大致估計(jì)適用jvm 堆大小約為2G - 64G。

? ? ? ? G1垃圾回收器每塊region也分為eden sruvivor和old。但不在物理上連續(xù),只在邏輯上連續(xù)。此外還有一種為Humongous,當(dāng)對(duì)象大小超過(guò)region大小一半時(shí),會(huì)直接分配H區(qū),但是大對(duì)象的回收沒(méi)有優(yōu)化,因此要避免在產(chǎn)生這樣的大對(duì)象。G1的堆模型并不會(huì)規(guī)定各個(gè)區(qū)的大小,因此給內(nèi)存分配和垃圾回收帶來(lái)極大的靈活性。

2、堆回收算法比較

? ? 傳統(tǒng)垃圾回收器是需要搭配使用的,在新生代和老年代分別使用不同的回收器。各垃圾回收器比較如下。

各垃圾回收器比較

比較典型的搭配是parNew(負(fù)責(zé)新生代) + CMS(負(fù)責(zé)老年代)。 gc方式主要包括兩種:minor gc major gc。

? ? ? ? minor gc發(fā)生在Young Generation區(qū),采用復(fù)制算法。數(shù)據(jù)分配首先都分配在新生代,當(dāng)新生代滿后,會(huì)觸發(fā)minor gc,數(shù)據(jù)會(huì)復(fù)制到survivor區(qū),如果survivor不夠或者到達(dá)晉升年齡,數(shù)據(jù)會(huì)從新生代晉升到老年代。

? ? ? ? 當(dāng)老年代不夠分配給新對(duì)象時(shí),會(huì)觸發(fā)major gc。需要注意的是CMS回收器的major gc采用是標(biāo)記清除算法,只清除不整理,容易產(chǎn)生內(nèi)存碎片。當(dāng)內(nèi)存碎片太多,majorGc后仍不夠分配的情況下,會(huì)觸發(fā)一次full gc,進(jìn)行全堆回收。CMS提供了參數(shù) -XX:CMSFullGCsBeforeCompaction指定在多次majorgc后執(zhí)行一次帶壓縮的full gc。需要注意的是cms的major gc會(huì)觸發(fā)一次minor gc,而且在做major gc時(shí)候是全堆掃描。

major? gc前
major gc后

????從上面可以看到,cms做完并發(fā)清理后,老年代仍然存在很多碎片。

????G1垃圾回收器回收算法主要包括三種:young gc, mixed gc以及full gc。三種回收方式都是標(biāo)記整理,可以有效避免碎片的產(chǎn)生,提高內(nèi)存使用情況。

G1垃圾回收算法

????G1垃圾回收的過(guò)程主要包括以下幾個(gè)部分,需要注意其中部分過(guò)程是mixed和young都存在的。

? ? ? ? 1、Initial Mark:STW, 在young gc時(shí)候完成,標(biāo)記可能指向old 區(qū)的對(duì)象的survivor區(qū);

? ? ? ? 2、Root Region Scanning:掃描Initial Mark中標(biāo)記的survivor區(qū)指向老年代對(duì)象的引用,需要在young gc完成前結(jié)束。

? ? ? ? 3、?Concurrent Marking:掃描整堆上存活的對(duì)象,可以被young gc打斷

? ? ? ? 4、Remark:Mark:STW, 完成整個(gè)標(biāo)記工作,基于SATB算法,重標(biāo)記的速度遠(yuǎn)遠(yuǎn)快于CMS上的重標(biāo)記。

? ? ? ? 5、Cleanup:STW, 統(tǒng)計(jì)存活對(duì)象和空白區(qū)域,重制RSet,將空白區(qū)域放入空閑列表

? ? ? ? 6、Copying:STW,? 將存活對(duì)象拷貝到其他空白位置,可以通過(guò)gc日志區(qū)分這個(gè)階段是發(fā)生在young gc還是mixed gc上。

3 G1垃圾回收器特點(diǎn)??

????在JDK 12發(fā)布ZGC之前,G1垃圾回收器一直代表著回收器的最新技術(shù)水平,作為G1與以前的回收器相比有哪些特點(diǎn)呢?? ?

? ? 1、基于標(biāo)記整理算法,有效避免空間碎片產(chǎn)生;

? ? 2、基于可停頓的時(shí)間,提供最高的回收效果,即在指定的時(shí)間范圍內(nèi),回收最大的內(nèi)存空間。

? ??It is important to note that G1 is not a real-time collector. It meets the set pause time target with high probability but not absolute certainty. Based on data from previous collections, G1 does an estimate of how many regions can be collected within the user specified target time. Thus, the collector has a reasonably accurate model of the cost of collecting the regions, and it uses this model to determine which and how many regions to collect while staying within the pause time target.

? ? 第一點(diǎn)其實(shí)比較明顯,有意思的是第二點(diǎn)是如何實(shí)現(xiàn)的呢?實(shí)際上是G1在做垃圾回收時(shí)候,存在一個(gè)全局標(biāo)記階段,標(biāo)記完后回收器即知道回收哪些區(qū)域可以獲得最大的內(nèi)存,此外G1回收器會(huì)基于回收模型算法,基于前面的回收情況,評(píng)估在期望的時(shí)間范圍內(nèi)可以回收多少塊region并優(yōu)先對(duì)這些高回收價(jià)值的region進(jìn)行回收,這也是G1垃圾回收器的名稱由來(lái)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容