日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

G1GC参数说明

發(fā)布時(shí)間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 G1GC参数说明 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • G1 GC是啟發(fā)式算法,會(huì)動(dòng)態(tài)調(diào)整年輕代的空間大小。
  • 目標(biāo)也就是為了達(dá)到接近預(yù)期的暫停時(shí)間。
  • G1提供了兩種GC模式,YoungGC和Mixed GC,兩種都是Stop The World(STW)的。

Young GC

YoungGC主要是對(duì)Eden區(qū)進(jìn)行GC,它在Eden空間耗盡時(shí)會(huì)被觸發(fā)。
在這種情況下,Eden空間的數(shù)據(jù)移動(dòng)到Survivor空間中,如果Survivor空間不夠,Eden空間的部分?jǐn)?shù)據(jù)會(huì)直接晉升到老年代空間。Survivor區(qū)的數(shù)據(jù)移動(dòng)到新的Survivor區(qū)中,也有部分?jǐn)?shù)據(jù)晉升到老年代空間中。最終Eden空間的數(shù)據(jù)為空,GC停止工作,應(yīng)用線程繼續(xù)執(zhí)行。

Mixed GC

Mix GC不僅進(jìn)行正常的新生代垃圾收集,同時(shí)也回收部分后臺(tái)掃描線程標(biāo)記的老年代分區(qū)。
GC步驟分2步:全局并發(fā)標(biāo)記(global concurrent marking)和 拷貝存活對(duì)象(evacuation)。
在進(jìn)行Mix GC之前,會(huì)先進(jìn)行g(shù)lobal concurrent marking(全局并發(fā)標(biāo)記)。global concurrent marking的執(zhí)行過程是怎樣的呢?在G1GC中,它主要是為Mixed GC提供標(biāo)記服務(wù)的,并不是一次GC過程的一個(gè)必須環(huán)節(jié)。

-XX:MaxGCPauseMillis

暫停時(shí)間,默認(rèn)值200ms。這是一個(gè)軟性目標(biāo),G1會(huì)盡量達(dá)成,如果達(dá)不成,會(huì)逐漸做自我調(diào)整。

對(duì)于YoungGC來說,會(huì)逐漸減少Eden區(qū)個(gè)數(shù),減少Eden空間那么Young GC的處理時(shí)間就會(huì)相應(yīng)減少。對(duì)于MixedGC,G1會(huì)調(diào)整每次Choose Cset的比例,默認(rèn)最大值是10%,當(dāng)然每次選擇的Cset少了,所要經(jīng)歷的MixedGC的次數(shù)會(huì)相應(yīng)增加。

減少Eden的總空間時(shí),就會(huì)更加頻繁的觸發(fā)Young GC,也就是會(huì)加快Mixed GC的執(zhí)行頻率,因?yàn)镸ixedGC是由Young GC觸發(fā)的,或者說借機(jī)同時(shí)執(zhí)行的。頻繁GC會(huì)對(duì)對(duì)應(yīng)用的吞吐量造成影響,每次MixedGC回收時(shí)間太短,回收的垃圾量太少,可能最后GC的垃圾清理速度趕不上應(yīng)用產(chǎn)生的速度,那么可能會(huì)造成串行的FullGC,這是要極力避免的。所以暫停時(shí)間肯定不是設(shè)置的越小越好,當(dāng)然也不能設(shè)置的偏大,轉(zhuǎn)而指望G1自己會(huì)盡快的處理,這樣可能會(huì)導(dǎo)致一次全部并發(fā)標(biāo)記后觸發(fā)的MixedGC次數(shù)變少,但每次的時(shí)間變長(zhǎng),STW時(shí)間變長(zhǎng),對(duì)應(yīng)用的影響更加明顯。

-XX:G1HeapRegionSize

Region大小,若未指定則默認(rèn)最多生成2048塊,每塊的大小需要為2的冪次方,如1,2,4,8,16,32,最大值為32M。
Region的大小主要是關(guān)系到Humongous Object的判定,當(dāng)一個(gè)對(duì)象超過Region大小的一半時(shí),則為巨型對(duì)象,那么其會(huì)至少獨(dú)占一個(gè)Region,如果一個(gè)放不下,會(huì)占用連續(xù)的多個(gè)Region。當(dāng)一個(gè)Humongous Region放入了一個(gè)巨型對(duì)象,可能還有不少剩余空間,但是不能用于存放其他對(duì)象,這些空間就浪費(fèi)了。所以如果應(yīng)用里有很多大小差不多的巨型對(duì)象,可以適當(dāng)調(diào)整Region的大小,盡量讓他們以普通對(duì)象的形式分配,合理利用Region空間。

-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent

新生代比例有兩個(gè)數(shù)值指定,下限:-XX:G1NewSizePercent,默認(rèn)值5%,上限:-XX:G1MaxNewSizePercent,默認(rèn)值60%。
G1會(huì)根據(jù)實(shí)際的GC情況(主要是暫停時(shí)間)來動(dòng)態(tài)的調(diào)整新生代的大小,主要是Eden Region的個(gè)數(shù)。最好是Eden的空間大一點(diǎn),畢竟Young GC的頻率更大,大的Eden空間能夠降低Young GC的發(fā)生次數(shù)。但是Mixed GC是伴隨著Young GC一起的,如果暫停時(shí)間短,那么需要更加頻繁的Young GC,同時(shí)也需要平衡好Mixed GC中新生代和老年代的Region,因?yàn)樾律乃蠷egion都會(huì)被回收,如果Eden很大,那么留給老年代回收空間就不多了,最后可能會(huì)導(dǎo)致Full GC。

-XX:ConcGCThreads

通過 -XX:ConcGCThreads來指定并發(fā)GC線程數(shù),默認(rèn)是-XX:ParallelGCThreads/4,也就是在非STW期間的GC工作線程數(shù),當(dāng)然其他的線程很多工作在應(yīng)用上。
當(dāng)并發(fā)周期時(shí)間過長(zhǎng)時(shí),可以嘗試調(diào)大GC工作線程數(shù),但是這也意味著此期間應(yīng)用所占的線程數(shù)減少,會(huì)對(duì)吞吐量有一定影響。
ConcGCThreads = (3 + ParallelGCThreads) / 4

-XX:ParallelGCThreads

通過-XX:ParallelGCThreads來指定并行GC線程數(shù),也就是在STW階段工作的GC線程數(shù)。
其值遵循以下原則:

如果用戶顯示指定了ParallelGCThreads,則使用用戶指定的值。否則需要根據(jù)實(shí)際的CPU所能夠支持的線程數(shù)來計(jì)算ParallelGCThreads的值。

如果物理CPU所能夠支持線程數(shù)小于8,則ParallelGCThreads的值為CPU所支持的線程數(shù)。這里的閥值為8,是因?yàn)镴VM中調(diào)用nof_parallel_worker_threads接口所傳入的switch_pt的值均為8。

如果物理CPU所能夠支持線程數(shù)大于8,則ParallelGCThreads的值為8加上一個(gè)調(diào)整值,調(diào)整值的計(jì)算方式為:物理CPU所支持的線程數(shù)減去8所得值的5/8或者5/16,JVM會(huì)根據(jù)實(shí)際的情況來選擇具體是乘以5/8還是5/16。

ParallelGCThreads=8 + (N - 8) * 5 / 8
比如,在64線程的x86 CPU上,如果用戶未指定ParallelGCThreads的值,則默認(rèn)的計(jì)算方式為:
ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。

-XX:G1MixedGCLiveThresholdPercent

通過這個(gè)參數(shù)指定被納入Cset的Region的存活空間占比閾值,不同版本默認(rèn)值不同,有65%和85%。
在全局并發(fā)標(biāo)記階段,如果一個(gè)Region的存活對(duì)象的空間占比低于此值,則會(huì)被納入Cset。此值直接影響到Mixed GC選擇回收的區(qū)域,當(dāng)發(fā)現(xiàn)GC時(shí)間較長(zhǎng)時(shí),可以嘗試調(diào)低此閾值,盡量?jī)?yōu)先選擇回收垃圾占比高的Region,但此舉也可能導(dǎo)致垃圾回收的不夠徹底,最終觸發(fā)Full GC。

-XX:InitiatingHeapOccupancyPercent

通過這個(gè)參數(shù)指定觸發(fā)全局并發(fā)標(biāo)記的老年代使用占比,默認(rèn)值45%,也就是老年代占堆的比例超過45%。
如果Mixed GC周期結(jié)束后老年代使用率還是超過45%,那么會(huì)再次觸發(fā)全局并發(fā)標(biāo)記過程,這樣就會(huì)導(dǎo)致頻繁的老年代GC,影響應(yīng)用吞吐量。同時(shí)老年代空間不大,Mixed GC回收的空間肯定是偏少的??梢赃m當(dāng)調(diào)高IHOP的值,當(dāng)然如果此值太高,很容易導(dǎo)致年輕代晉升失敗而觸發(fā)Full GC,所以需要多次調(diào)整測(cè)試。

-XX:G1HeapWastePercent

通過這個(gè)參數(shù)指定觸發(fā)Mixed GC的堆垃圾占比,默認(rèn)值5%,也就是在全局標(biāo)記結(jié)束后能夠統(tǒng)計(jì)出所有Cset內(nèi)可被回收的垃圾占整對(duì)的比例值,
如果超過5%,那么就會(huì)觸發(fā)之后的多輪Mixed GC,
如果不超過,那么會(huì)在之后的某次Young GC中重新執(zhí)行全局并發(fā)標(biāo)記。
可以嘗試適當(dāng)?shù)恼{(diào)高此閾值,能夠適當(dāng)?shù)慕档蚆ixed GC的頻率。

-XX:G1OldCSetRegionThresholdPercent

通過這個(gè)參數(shù)指定每輪Mixed GC回收的Region最大比例,默認(rèn)10%,也就是每輪Mixed GC附加的Cset的Region不超過全部Region的10%,最多10%,如果暫停時(shí)間短,那么可能會(huì)少于10%。
一般這個(gè)值不需要額外調(diào)整。

-XX:G1MixedGCCountTarget

通過這個(gè)參數(shù)指定一個(gè)周期內(nèi)觸發(fā)Mixed GC最大次數(shù),默認(rèn)值8。
一次全局并發(fā)標(biāo)記后,最多接著8次Mixed GC,把全局并發(fā)標(biāo)記階段生成的Cset里的Region拆分為最多8部分,然后在每輪Mixed GC里收集一部分。
這個(gè)值要和上一個(gè)參數(shù)配合使用,8*10%=80%,應(yīng)該來說會(huì)大于每次標(biāo)記階段的Cset集合了。
一般此參數(shù)也不需額外調(diào)整。

-XX:G1ReservePercent

通過這個(gè)參數(shù)指定G1為分配擔(dān)保預(yù)留的空間比例,默認(rèn)10%。也就是老年代會(huì)預(yù)留10%的空間來給新生代的對(duì)象晉升,如果經(jīng)常發(fā)生新生代晉升失敗而導(dǎo)致Full GC,那么可以適當(dāng)調(diào)高此閾值。但是調(diào)高此值同時(shí)也意味著降低了老年代的實(shí)際可用空間。

-XX:MaxTenuringThreshold

晉升年齡閾值,默認(rèn)值15。
一般新生對(duì)象經(jīng)過15次Young GC會(huì)晉升到老年代,巨型對(duì)象會(huì)直接分配在老年代,同時(shí)在Young GC時(shí),如果相同age的對(duì)象占Survivors空間的比例超過 -XX:TargetSurvivorRatio的值(默認(rèn)50%),則會(huì)自動(dòng)將此次晉升年齡閾值設(shè)置為此age的值,所有年齡超過此值的對(duì)象都會(huì)被晉升到老年代,此舉可能會(huì)導(dǎo)致老年代需要不少空間應(yīng)對(duì)此種晉升。
一般這個(gè)值不需要額外調(diào)整。

調(diào)優(yōu)建議

  • 不要手動(dòng)設(shè)置新生代和老年代的大小,只設(shè)置這個(gè)堆的大小 G1收集器在運(yùn)行過程中,會(huì)自己調(diào)整新生代和老年代的大小,其實(shí)是通過adapt代的大小來調(diào)整對(duì)象晉升的速度和年齡,從而達(dá)到為收集器設(shè)置的暫停時(shí)間目標(biāo),如果手動(dòng)設(shè)置了大小就意味著放棄了G1的自動(dòng)調(diào)優(yōu)。
  • 不斷調(diào)優(yōu)暫停時(shí)間目標(biāo)-XX:MaxGCPauseMillis,一般情況下這個(gè)值設(shè)置到100ms或者200ms,暫停時(shí)間設(shè)置的太短,就會(huì)導(dǎo)致出現(xiàn)G1跟不上垃圾產(chǎn)生的速度。最終退化成Full GC。所以對(duì)這個(gè)參數(shù)的調(diào)優(yōu)是一個(gè)持續(xù)的過程,逐步調(diào)整到最佳狀態(tài)。暫停時(shí)間只是一個(gè)目標(biāo),并不能總是得到滿足。
  • MixedGC調(diào)優(yōu)

    -XX:InitiatingHeapOccupancyPercent
    -XX:G1MixedGCLiveThresholdPercent
    -XX:G1MixedGCCountTarger

    適當(dāng)增加堆內(nèi)存大小
    G1里的Java堆尺寸通常是分區(qū)的整數(shù)倍。除去這個(gè)限制,G1和其他HotSpot垃圾收集器一樣,可以在 -Xms與 -Xmx之間動(dòng)態(tài)地?cái)U(kuò)大或縮小堆大小。

    以下幾種情況,G1可能會(huì)增加Java堆尺寸:

  • 在一次full GC中,基于堆尺寸的計(jì)算結(jié)果會(huì)調(diào)整堆的空間。
  • 當(dāng)發(fā)生年輕代收集或混合收集,G1會(huì)計(jì)算執(zhí)行GC所花費(fèi)的時(shí)間以及執(zhí)行Java應(yīng)用所花費(fèi)的時(shí)間。根據(jù)命令行配置-XX:GCTimeRatio,如果將太多時(shí)間用在垃圾收集上,Java堆尺寸就會(huì)增加。這個(gè)情況下增加Java堆尺寸,其背后的想法就是允許GC減少發(fā)生頻度,這樣與花在應(yīng)用上的時(shí)間相比,花在GC上的時(shí)間也可以隨之降低。
  • G1中-XX:GCTimeRatio的缺省值為9,而其他所有HotSpot垃圾收集器都缺省使用99。GCTimeRatio的值越大,Java堆尺寸的增長(zhǎng)就會(huì)更加得積極。其他HotSpot收集器在增加Java堆尺寸的策略上會(huì)更加激進(jìn),因?yàn)樗鼈兊哪繕?biāo)是:相對(duì)于執(zhí)行應(yīng)用的開銷,用于GC的時(shí)間越少越好。
  • 如果一個(gè)對(duì)象分配失敗了(甚至是在做了一次GC之后),G1會(huì)嘗試通過增加堆尺寸來滿足對(duì)象分配,而不是馬上退回去做一次full GC。
  • 如果一個(gè)巨型對(duì)象分配無法找到足夠的連續(xù)分區(qū)來容納這個(gè)對(duì)象,G1會(huì)嘗試擴(kuò)展Java堆來獲得更多可用分區(qū),而不是做一次full GC。
  • 當(dāng)GC需要一個(gè)新的分區(qū)來轉(zhuǎn)移對(duì)象時(shí),G1更傾向于通過增加Java堆空間來獲得一個(gè)新的分區(qū),而不是通過返回GC失敗并開始做一次full GC來找到一個(gè)可用分區(qū)。
  • 總結(jié)

    以上是生活随笔為你收集整理的G1GC参数说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。