JVM之G1垃圾收集器
一、概述:
?
G1(Grabage-First)是一款面向服務端應用的垃圾收集器,主要針對配備多核cpu及大容量內存的機器,以及高概率滿足GC停頓時間的同時,還兼顧高吞吐量的的性能特征
在JDK1.7版本正式啟用,移除了Experimental的標識,是JDK 9以后的默認垃圾回收器,取代了CMS 回收器以及Parallel + Parallel Ol的組合。被Oracle官方稱為“全功能垃圾收集器”。
與此同時,CMS已經在JDK9中被標記為廢棄(deprecated)。在jdk8中還不是默認垃圾收集器,需要使用-XX:+UserG1GC來啟用。
二、為什么叫G1
a、因為G1是一個并行回收器,它把堆內存分割為很多不相關的區(qū)域(Region)物理上是不連續(xù)的,使用不同的Region來表示Eden、幸存者0區(qū)、幸存者1區(qū),老年代等。
三、G1回收器的特點:
a、并行與并發(fā):
并行性:G1在回收期間,可以有多個GC線程同時工作,有效利用多核計算能力,此時用戶線程STW
并發(fā)性:G1擁有與應用程序交替執(zhí)行的能力,部分工作可以和應用程序同時執(zhí)行,因此,一般來說,不會在整個回收階段發(fā)生完全阻塞應用程序的情況。
b、分代收集:
(1)從分代上看,G1依然屬于分代型垃圾收集器,它不區(qū)分年輕代和老年代,年輕代依然有Eden區(qū)和Survivor區(qū)。但從堆的結構上看,它不要求整個Eden區(qū)、年輕代或者老年代都是連續(xù)的,也不再堅持固定大小和固定數(shù)量。
如下圖:
?
?(2)將堆空間氛圍若干個區(qū)域(Region),這些區(qū)域中包含了邏輯上的年輕代和老年代。
(3)和之前的各類回收器不同,它同時兼顧年輕代和老年代,對比其他回收器,或者工作在年輕代或者工作在老年代。
C、空間整合
(1)CMS:“標記-清除”算法、內存碎片,若干次GC后進行一次碎片整理
(2)G1將內存劃分為一個個的region。內存的回收是以region作為基本單位的
Region之間是復制算法,但整體上實際可看作是標記-壓縮(Mark-Compact)算法,兩種算法都可以避免內存碎片,這種特性有利于程序長時間運行,分配大對象不會因為無法找到連續(xù)內存空間而提前觸發(fā)下一次GC。尤其是當Java堆非常大的時候,G1的優(yōu)勢更加明顯。
d、可預測的停頓時間模型(即:軟實時soft real-time)
這是G1相對于CMS的另一大優(yōu)勢,G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用明確指定在一個長度為M毫秒的時間片段內,消耗垃圾收集的時間不得超過N毫秒。
(1)由于分區(qū)的原因,G1可以之選取部分區(qū)域進行內存回收,這樣縮小了回收范圍,因此對于全局停頓情況的發(fā)生也能得到較好的控制
(2)G1跟蹤各個Region里面的垃圾堆積的價值大小(回收所活得的空間大小以及回收所需要時間的經驗值),在后臺維護一個優(yōu)先列表,每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的region,保證了G1收集器在有限的時間內可以獲得進可能高的收集效率
(3)相比與CMS GC,G1未必能做到CMS在最好情況下的延時停頓、但最差情況要好很多。
四、缺點:
相較于CMS,G1還不具備全方位,壓倒性優(yōu)勢。比如在用戶程序運行過程中,G1無論是為了垃圾收集產生的內存占用(Footprint)還是程序運行時的額外執(zhí)行負載(Overload)都要比CMS要高
從經驗上來說,在小內存應用上CMS的表現(xiàn)大概率會優(yōu)于G1,而G1在大內存應用上則發(fā)揮其優(yōu)勢。平衡點在6-8GB之間
五、參數(shù)設置:
-XX:+UserG1GC 手動指定使用G1收集器執(zhí)行內存回收任務。
-XX:? +G1HeapRegionSize 設置每個Region的大小,值是2的冪,范圍是1MB到32MB,默認是堆內存的1/2000,目標是根據(jù)最小的Java堆大小劃分出約2048個區(qū)域。
-XX:MaxGCPauseMillis 設置期望達到的最大GC停頓時間指標(JVM會盡力實現(xiàn),但不保證達到)。默認值是200ms
-XX:ParallelGCThread 設置STW時GC線程數(shù)的值,最多設置為8
-XX:ConcGCThread 設置并發(fā)標記的線程數(shù),將n設置為并行垃圾回收線程數(shù)(ParallerlGCThreads)的1/4左右
-XX:InitiatingHeapOccupancyPercent 設置出發(fā)并發(fā)GC周期Java堆占用率的閾值。超過此值,就出發(fā)GC,默認值是45.
六、G1的使用
G1的設計原則就是簡化JVM性能調優(yōu),開發(fā)人員只需要簡單的三步即可完成調優(yōu):
第一步:開啟G1垃圾收集器
第二步:設置堆的最大內存
第三步:設置最大的停頓時間
G1中提供了三種垃圾回收模式:YoungGC、Mixed GC 和Full GC,在不同的條件下被觸發(fā)。
七、G1 使用的場景:
?八、region的使用:
a、概述:使用G1收集器時,它將整個Java堆劃分成2048個大小相同的獨立Region塊,每個Region塊大小根據(jù)堆空間的實際大小而定,整個被控制在1MB到32MB之間,且為2的N次冪,即1MB、2MB、4MB、8MB、16MB、32MB、可以通過-XX:G1HeapRegionSize設定。所有的Region大小相同,且在JVM生命周期內不會被改變。
雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,他們都是一部分Region(不需要連續(xù))的集合。通過Region的動態(tài)分配方式實現(xiàn)邏輯上的連續(xù)。
b、圖解:
?一個Region有可能屬于Eden,Survivor 或者 Old/Tenured 內存區(qū)域,但是一個region只可能屬于一個角色。圖中E 表示該region 屬于Eden內存區(qū)域,s表示屬于Survivor 內存區(qū)域,o 表示屬于Old內存區(qū)域。途中空白的表示未使用的內存空間。
G1 垃圾收集器還增加了一個新的內存區(qū)域,叫做Humongous 內存區(qū)域,如圖中的H塊。主要用于存儲大對象,如果超過1.5個region ,就放到H。
c、設置H的原因:
對于堆中的大對象,默認直接分配到老年代,但是如果它是一個短期存在的大對象,就會對垃圾收集器造成負面影響,為了解決這個問題,G1劃分了一個Humongous區(qū),它用來專門存放大對象,如果一個H區(qū)域裝不下一個大對象,那么G1會尋找連續(xù)的H區(qū)來存儲,為了能找到連續(xù)的H區(qū),有時候不得不啟動Full GC。G1的大多數(shù)行為都把H區(qū)域作為老年代的一部分來看待。
d、region 分配方式:
?九、G1垃圾回收器的主要環(huán)節(jié):
?圖解:
?應用程序分配內存,當年輕代的Eden區(qū)用盡時開始年輕代回收過程;G1的年輕代收集階段是一個并行的獨占式收集器。在年輕代回收期,G1 GC暫停所有應用程序線程,啟動多線程執(zhí)行年輕代回收。然后從年輕代區(qū)間移動存活對象到Survivor 區(qū)間或者老年代區(qū)間,也有可能是兩個區(qū)間都會涉及。
當堆內存使用達到一定值(默認45%)時,開始老年代并發(fā)標記過程
標記完成馬上開始混合回收過程,對于一個混合回收期,G1 GC 從老年代區(qū)間移動存活對象到空閑區(qū)間,這些空閑區(qū)間也就成了老年代的一部分,和年輕代不同,老年代的G1 回收器和 其他GC 不同,G1的老年代回收器不需要整個老年代被回收,一次只需要掃描/回收一小部分老年代的Region就可以了,同時,這個老年代Region是和年輕代一起被回收的。
十、記憶集和寫屏障
前提:
一個對象被不同區(qū)域引用的問題。
一個Region不可能是孤立的,一個Region中的對象可能被其他任意Region中對象引用,判斷對象存活時,是否需要掃描整個Java堆才能保證準確?
在其他的分代收集器,也存在這樣的問題(而G1更突出)
回收新生代也不得不同時掃描老年代?
這樣的話會降低Minor GC 的效率。
解決如上問題:
無論G1還是其他分代收集器,JVM都是使用Remembered Set(記憶集)來避免全局掃描,
每個Region 都有一個對應的Remembered Set;
如圖:
?每次Reference類型數(shù)據(jù)寫操作時,都會產生一個Write Barrier(寫屏障)暫時中斷操作,
然后檢查將要寫入引用指向的對象是否和該Reference類型數(shù)據(jù)在不同的Region(其他收集器:檢查老年代對象是否引用新生代對象);
如果不同,通過CardTable 把相關引用信息記錄到引用引用對象的所在的Region對應的Remembered Set 中。
當進行垃圾收集時,在GC根節(jié)點的枚舉范圍加入Remembered Set中,就可以保證不進行全局掃描,也不會有遺漏。
十一、G1 具體收集過程:
?年輕代GC:
?
?備注:
?
?并發(fā)標記過程:
?混合回收:
?
?Full GC:
?十二、例子:
G1 正常的例子:
?
總結
以上是生活随笔為你收集整理的JVM之G1垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【百度春招】 买帽子
- 下一篇: ZUCC_计算机网络实验_实验01 实验