JVM G1垃圾回收器總結(jié)

G1垃圾收集器

G1是一個(gè)面向服務(wù)端的JVM垃圾收集器朵你,適用于多核處理器、大內(nèi)存容量的服務(wù)端系統(tǒng)。 它滿足短時(shí)間停頓的同時(shí)達(dá)到一個(gè)高的吞吐量澈蟆。從JDK 9開始,G1成為默認(rèn)的垃圾回收器卓研。
當(dāng)應(yīng)用有以下任何一種特性時(shí)非常適合用G1:

  • Full GC持續(xù)時(shí)間太長(zhǎng)或者太頻繁
  • 對(duì)象的創(chuàng)建速率和存活率變動(dòng)很大
  • 應(yīng)用不希望停頓時(shí)間長(zhǎng)(長(zhǎng)于0.5s甚至1s)

G1對(duì)Heap的劃分


G1按固定大小把內(nèi)存劃分為很多小區(qū)域(region)趴俘,這個(gè)堆大概有2000多塊;在邏輯上奏赘,某些小區(qū)域構(gòu)成Eden寥闪,某些構(gòu)成Survivor,某些構(gòu)成老年代磨淌,這些小區(qū)域物理上是不相連的疲憋,并且構(gòu)成新生代和老年代的區(qū)域可以動(dòng)態(tài)改變。
可以通過命令行參數(shù)-XX:NewRatio=n來(lái)配置老年代和新生代的比例伦糯,默認(rèn)為2柜某,即比例為2:1;-XX:SurvivorRatio=n則可以配置Eden與Survivor的比例敛纲,默認(rèn)為8喂击。

Young GC

當(dāng)Eden區(qū)的空間占滿之后,會(huì)觸發(fā)Young GC淤翔,G1將Eden和Survivor中存活的對(duì)象拷貝到Survivor翰绊,或者直接晉升到Old Region中。Young GC的執(zhí)行是多線程并發(fā)的旁壮,期間會(huì)停頓所有的用戶線程(STW)监嗜。



Old GC

當(dāng)堆空間的占用率達(dá)到一定閾值后會(huì)觸發(fā)Old GC(閾值由命令參數(shù)-XX:InitiatingHeapOccupancyPercent設(shè)定,默認(rèn)值45)抡谐,Old GC分五個(gè)步驟完成:

初始標(biāo)記(Initial Mark裁奇,STW)

對(duì)Survivor區(qū)域掃描,標(biāo)記出可能擁有老年代對(duì)象引用的根區(qū)域(Root Region)麦撵,該階段附屬于一次Young GC的最后階段刽肠,所以是STW。在GC日志中會(huì)被記錄為GC pause (young)(inital-mark)

根區(qū)域掃描(Root Region Scan)

從上一階段標(biāo)記的根區(qū)域中免胃,標(biāo)記所有擁有老年代對(duì)象引用的存活對(duì)象音五,這是一個(gè)并發(fā)的過程,而且必須在進(jìn)行下一次Young GC之前完成

并發(fā)標(biāo)記(Concurrent Marking)

從上一階段標(biāo)記的存活對(duì)象開始羔沙,并發(fā)地跟蹤所有可達(dá)的老年代對(duì)象躺涝,期間可以被Young GC打斷


最終標(biāo)記(Remark,STW)

G1并行地跟蹤在上面階段經(jīng)過更新的存活對(duì)象扼雏,找到未被標(biāo)記的存活的對(duì)象坚嗜,這是一個(gè)STW的階段夯膀,會(huì)用到一個(gè)初始快照(SATB)算法。在此期間完全空閑的區(qū)域會(huì)被直接重置回收苍蔬。


復(fù)制/清除(Copying/Cleanup棍郎,STW)

  • G1統(tǒng)計(jì)存活對(duì)象和完全空閑的區(qū)域,完全空閑區(qū)域?qū)⒈恢刂没厥?/li>
  • 執(zhí)行清理RSet的操作
  • 將存活對(duì)象復(fù)制到新的未被占用的區(qū)域银室。執(zhí)行這一步時(shí)可以只對(duì)新生代操作涂佃,這時(shí)G1將其記錄為[GC pause (young)];也可對(duì)新生代和一部分老年代都進(jìn)行處理蜈敢,這時(shí)被記錄為[GC Pause (mixed)]辜荠,這些老年代要根據(jù)其“存活度”去選擇。

G1相關(guān)的命令

java命令行參數(shù)

Option Description
-XX:+UseG1GC Use the Garbage First (G1) Collector
-XX:MaxGCPauseMillis=n Sets a target for the maximum GC pause time. This is a soft goal, and the JVM will make its best effort to achieve it.
-XX:InitiatingHeapOccupancyPercent=n Percentage of the (entire) heap occupancy to start a concurrent GC cycle. It is used by GCs that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (e.g., G1). A value of 0 denotes 'do constant GC cycles'. The default value is 45.
-XX:NewRatio=n Ratio of old/newgeneration sizes. The default value is 2.
-XX:SurvivorRatio=n Ratio of eden/survivor space size. The default value is 8.
-XX:MaxTenuringThreshold=n Maximum value for tenuring threshold. The default value is 15.
-XX:ParallelGCThreads=n Sets the number of threads used during parallel phases of the garbage collectors. The default value varies with the platform on which the JVM is running.
-XX:ConcGCThreads=n Number of threads concurrent garbage collectors will use. The default value varies with the platform on which the JVM is running.
-XX:G1ReservePercent=n Sets the amount of heap that is reserved as a false ceiling to reduce the possibility of promotion failure. The default value is 10.
-XX:G1HeapRegionSize=n With G1 the Java heap is subdivided into uniformly sized regions. This sets the size of the individual sub-divisions. The default value of this parameter is determined ergonomically based upon heap size. The minimum value is 1Mb and the maximum value is 32Mb.

查看JVM默認(rèn)的垃圾回收器

java -XX:+PrintCommandLineFlags -version

-XX:G1ConcRefinementThreads=4 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC 
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

查看JVM當(dāng)前堆情況

jmap -heap pid 

jmap -heap  20932
Attaching to process ID 20932, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4164943872 (3972.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 2498756608 (2383.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3972
   capacity = 4164943872 (3972.0MB)
   used     = 2132264664 (2033.4860458374023MB)
   free     = 2032679208 (1938.5139541625977MB)
   51.19551978442604% used
G1 Young Generation:
Eden Space:
   regions  = 829
   capacity = 2317352960 (2210.0MB)
   used     = 869269504 (829.0MB)
   free     = 1448083456 (1381.0MB)
   37.51131221719457% used
Survivor Space:
   regions  = 9
   capacity = 9437184 (9.0MB)
   used     = 9437184 (9.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 1254
   capacity = 1741684736 (1661.0MB)
   used     = 1253557976 (1195.4860458374023MB)
   free     = 488126760 (465.51395416259766MB)
   71.9738739215775% used

19747 interned Strings occupying 1885184 bytes.

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抓狭,一起剝皮案震驚了整個(gè)濱河市伯病,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌否过,老刑警劉巖午笛,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苗桂,居然都是意外死亡药磺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門煤伟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)癌佩,“玉大人,你說(shuō)我怎么就攤上這事便锨∥д蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵放案,是天一觀的道長(zhǎng)姚建。 經(jīng)常有香客問我,道長(zhǎng)吱殉,這世上最難降的妖魔是什么掸冤? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮考婴,結(jié)果婚禮上贩虾,老公的妹妹穿的比我還像新娘催烘。我一直安慰自己沥阱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布伊群。 她就那樣靜靜地躺著考杉,像睡著了一般策精。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崇棠,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天咽袜,我揣著相機(jī)與錄音,去河邊找鬼枕稀。 笑死询刹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萎坷。 我是一名探鬼主播凹联,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哆档!你這毒婦竟也來(lái)了蔽挠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓜浸,失蹤者是張志新(化名)和其女友劉穎澳淑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體插佛,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杠巡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雇寇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忽孽。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谢床,靈堂內(nèi)的尸體忽然破棺而出兄一,到底是詐尸還是另有隱情,我是刑警寧澤识腿,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布出革,位于F島的核電站,受9級(jí)特大地震影響渡讼,放射性物質(zhì)發(fā)生泄漏骂束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一成箫、第九天 我趴在偏房一處隱蔽的房頂上張望展箱。 院中可真熱鬧,春花似錦蹬昌、人聲如沸混驰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栖榨。三九已至昆汹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婴栽,已是汗流浹背满粗。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愚争,地道東北人映皆。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像轰枝,于是被迫代替她去往敵國(guó)和親劫扒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354