日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

垃圾收集器G1&ZGC詳解

作者:bingtanghulu_6 更新時(shí)間: 2022-05-11 編程語(yǔ)言

目錄

1.G1垃圾收集器

1.1 垃圾回收過(guò)程

?1.2 G1垃圾收集分類(lèi)

1.3 G1收集器核心參數(shù)手冊(cè)

2.ZGC垃圾收集器(面試不考)

2.1 ZGC的內(nèi)存布局

?2.2 ZGC的架構(gòu)NUMA模型

2.3 ZGC運(yùn)作過(guò)程

?2.4 顏色指針和讀屏障

1.G1垃圾收集器

G1垃圾收集器是一款面向多CPU,大內(nèi)存的垃圾收集器,內(nèi)部采用region內(nèi)存塊的概念,將內(nèi)存塊分為多個(gè),里面將內(nèi)存塊劃分為Eden,survivor,old,humongous(大對(duì)象存儲(chǔ))區(qū)域。并不是連續(xù)的區(qū)域。

------

內(nèi)存劃分舉例:

4G的JVM占比,一個(gè)region大小:4*1024/2048(默認(rèn)2048個(gè)region)=2M。

年輕代占比默認(rèn)初始值5%=4096*5%=204.8M,最大不會(huì)超過(guò)60%=4096*0.6=2457.6M

年輕代Eden:s0:s1默認(rèn)=8:1:1

------

G1參數(shù):

使用G1垃圾收集器:-XX:+UseG1GC

region大小:-XX:G1HeapRegionSize,可以指定,但是推薦默認(rèn)
設(shè)置年輕代初始大小:-XX:G1NewSizePercent
設(shè)置年輕代最大大小:-XX:G1MaxNewSizePercent
-------
G1新增的一塊區(qū)域Humongous,專(zhuān)門(mén)用來(lái)放大對(duì)象,如果一個(gè)對(duì)象在放入eden區(qū)時(shí)判斷如果超過(guò)一塊Region的50%就將對(duì)象放入Humongous區(qū)域,如果很大,就將一塊連續(xù)的Region內(nèi)存塊分配給Humongous
-------
G1采用復(fù)制算法,比如有個(gè)old區(qū)域的內(nèi)存塊,會(huì)將其復(fù)制到相鄰的未使用的內(nèi)存塊中,然后清除這個(gè)內(nèi)存塊,效果類(lèi)似于標(biāo)記整理算法,不會(huì)產(chǎn)生不連續(xù)的內(nèi)存碎塊。
-------
G1會(huì)維護(hù)一個(gè)優(yōu)先列表,比如一塊Old內(nèi)存塊回收需要200ms,另一塊50ms,G1會(huì)優(yōu)先回收50ms的內(nèi)存塊。
-------
優(yōu)化建議:-XX:MaxGCPauseMills值建議使用默認(rèn)值200ms,如果業(yè)務(wù)很敏感可以設(shè)置小一點(diǎn)50ms
-------
使用場(chǎng)景:
1. 50%以上的堆被存活對(duì)象占用
2. 對(duì)象分配和晉升的速度變化非常大
3. 垃圾回收時(shí)間特別長(zhǎng),超過(guò)1秒
4. 8GB以上的堆內(nèi)存(建議值)
5. 停頓時(shí)間是500ms以?xún)?nèi)
-------
JVM內(nèi)存選取案例:
4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,幾百G以上用ZGC
-------
每秒幾十萬(wàn)并發(fā)如何優(yōu)化JVM案例:
使用G1垃圾收集器,常用的kafaka消息中間件需要的內(nèi)存一般都在64G,一般都是朝生夕死的對(duì)象,把年輕代大小劃分的大點(diǎn)。

?

1.1 垃圾回收過(guò)程

初始標(biāo)記(initial mark,STW):跟CMS一樣,標(biāo)記GC ROOTS下面的所有直接對(duì)象

并發(fā)標(biāo)記(Concurrent Mark):跟CMS一樣

最終標(biāo)記(final mark,STW):跟CMS一樣

篩選回收(Cleanup,STW):跟CMS不同的一點(diǎn)是這一步也是STW的,在回收時(shí)默認(rèn)G1里面有一個(gè)最大STW時(shí)間=初始標(biāo)記STW+最終標(biāo)記STW+篩選回收STW的總和,如果要回收的對(duì)象很大,比如回收1000個(gè)Region內(nèi)存塊,但是STW只有200ms,只能回收800個(gè)Region內(nèi)存塊,這一次GC就只回收800個(gè),剩下的200個(gè)下次GC回收。

-XX:MaxGCPauseMillis:STW停頓時(shí)間,默認(rèn)200ms

?

?1.2 G1垃圾收集分類(lèi)

Minor GC:當(dāng)Eden放滿(mǎn)內(nèi)存的5%以后會(huì)計(jì)算是否超過(guò)-XX:MaxGCPauseMillis設(shè)置最大停頓時(shí)間,如果超過(guò)才會(huì)minorGC。

Mixed GC: 當(dāng)老年代大小超過(guò)(-XX:InitiatingHeapOccupancyPercent)設(shè)置的值時(shí)會(huì)回收所有的年輕代和部分老年代對(duì)象,大對(duì)象也會(huì)回收。默認(rèn)45%

Full GC:如果沒(méi)有足夠的空間用來(lái)復(fù)制老年代對(duì)象時(shí)會(huì)觸發(fā)Full GC會(huì)使用單線(xiàn)程收集垃圾對(duì)象。

1.3 G1收集器核心參數(shù)手冊(cè)

-XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:指定GC工作的線(xiàn)程數(shù)量
-XX:G1HeapRegionSize:指定分區(qū)大小(1MB~32MB,且必須是2的N次冪),默認(rèn)將整堆劃分為2048個(gè)分區(qū)
-XX:MaxGCPauseMillis:目標(biāo)暫停時(shí)間(默認(rèn)200ms)
-XX:G1NewSizePercent:新生代內(nèi)存初始空間(默認(rèn)整堆5%)
-XX:G1MaxNewSizePercent:新生代內(nèi)存最大空間
-XX:TargetSurvivorRatio:Survivor區(qū)的填充容量(默認(rèn)50%),Survivor區(qū)域里的一批對(duì)象(年齡1+年齡2+年齡n的多個(gè)
年齡對(duì)象)總和超過(guò)了Survivor區(qū)域的50%,此時(shí)就會(huì)把年齡n(含)以上的對(duì)象都放入老年代
-XX:MaxTenuringThreshold:最大年齡閾值(默認(rèn)15)
-XX:InitiatingHeapOccupancyPercent:老年代占用空間達(dá)到整堆內(nèi)存閾值(默認(rèn)45%),則執(zhí)行新生代和老年代的混合
收集( MixedGC ),比如我們之前說(shuō)的堆默認(rèn)有2048個(gè)region,如果有接近1000個(gè)region都是老年代的region,則可能
就要觸發(fā)MixedGC了
-XX:G1MixedGCLiveThresholdPercent(默認(rèn)85%) region中的存活對(duì)象低于這個(gè)值時(shí)才會(huì)回收該region,如果超過(guò)這
個(gè)值,存活對(duì)象過(guò)多,回收的的意義不大。
-XX:G1MixedGCCountTarget:在一次回收過(guò)程中指定做幾次篩選回收(默認(rèn)8次),在最后一個(gè)篩選回收階段可以回收一
會(huì),然后暫停回收,恢復(fù)系統(tǒng)運(yùn)行,一會(huì)再開(kāi)始回收,這樣可以讓系統(tǒng)不至于單次停頓時(shí)間過(guò)長(zhǎng)。
-XX:G1HeapWastePercent(默認(rèn)5%): gc過(guò)程中空出來(lái)的region是否充足閾值,在混合回收的時(shí)候,對(duì)Region回收都
是基于復(fù)制算法進(jìn)行的,都是把要回收的Region里的存活對(duì)象放入其他Region,然后這個(gè)Region中的垃圾對(duì)象全部清
理掉,這樣的話(huà)在回收過(guò)程就會(huì)不斷空出來(lái)新的Region,一旦空閑出來(lái)的Region數(shù)量達(dá)到了堆內(nèi)存的5%,此時(shí)就會(huì)立
即停止混合回收,意味著本次混合回收就結(jié)束了。

?

2.ZGC垃圾收集器(面試不考)

參考文章: https://wiki.openjdk.java.net/display/zgc/Main
http://cr.openjdk.java.net/~pliden/slides/ZGC-Jfokus-2018.pdf

?ZGC的目標(biāo):

1.支持TB級(jí)別的JVM,現(xiàn)支持4TB-16TB

2.STW停頓時(shí)間10ms以?xún)?nèi)

3.奠定未來(lái)GC的基礎(chǔ)

4.最糟糕的情況下吞吐量會(huì)下降15%,可以通過(guò)擴(kuò)容解決。

-----

ZGC觸發(fā)時(shí)機(jī)
ZGC目前有4種機(jī)制觸發(fā)GC:
定時(shí)觸發(fā),默認(rèn)為不使用,可通過(guò)ZCollectionInterval參數(shù)配置。
預(yù)熱觸發(fā),最多三次,在堆內(nèi)存達(dá)到10%、20%、30%時(shí)觸發(fā),主要時(shí)統(tǒng)計(jì)GC時(shí)間,為其他GC機(jī)制使用。
分配速率,基于正態(tài)分布統(tǒng)計(jì),計(jì)算內(nèi)存99.9%可能的最大分配速率,以及此速率下內(nèi)存將要耗盡的時(shí)間點(diǎn),
在耗盡之前觸發(fā)GC(耗盡時(shí)間 - 一次GC最大持續(xù)時(shí)間 - 一次GC檢測(cè)周期時(shí)間)。
主動(dòng)觸發(fā),(默認(rèn)開(kāi)啟,可通過(guò)ZProactive參數(shù)配置) 距上次GC堆內(nèi)存增長(zhǎng)10%,或超過(guò)5分鐘時(shí),對(duì)比距上
次GC的間隔時(shí)間跟(
49 * 一次GC的最大持續(xù)時(shí)間),超過(guò)則觸發(fā)。

?

2.1 ZGC的內(nèi)存布局

?ZGC的Region可以具有如圖3-19所示的大、 中、 小三類(lèi)容量:

小型Region(
Small Region) : 容量固定為2MB, 用于放置小于256KB的小對(duì)象。
中型Region(Medium Region) : 容量固定為32MB, 用于放置大于等于256KB但小于4MB的對(duì)象。
大型Region(
Large Region) : 容量不固定, 可以動(dòng)態(tài)變化, 但必須為2MB的整數(shù)倍, 用于放置4MB或
以上的大對(duì)象。 每個(gè)大型Region中
只會(huì)存放一個(gè)大對(duì)象, 這也預(yù)示著雖然名字叫作“大型Region”, 但它的實(shí)際容量完全有可能小于中型
Region, 最小容量可低至4MB。 大型Region在ZGC的實(shí)現(xiàn)中是不會(huì)被重分配(重分配是ZGC的一種處理動(dòng)作,
用于復(fù)制對(duì)象的收集器階段, 稍后會(huì)介紹到)的, 因?yàn)閺?fù)制一個(gè)大對(duì)象的代價(jià)非常高昂

?

?2.2 ZGC的架構(gòu)NUMA模型

UMA:多個(gè)CPU只有一個(gè)內(nèi)存條,在訪問(wèn)時(shí)需要涉及到內(nèi)存的競(jìng)爭(zhēng),有鎖就會(huì)影響效率。

NUMA:每個(gè)CPU都有一塊內(nèi)存。

2.3 ZGC運(yùn)作過(guò)程

并發(fā)標(biāo)記:跟G1的類(lèi)似,只是在下圖初始標(biāo)記和最終標(biāo)記有一段些微的停頓。

并發(fā)預(yù)備重分配:計(jì)算要回收的對(duì)象

并發(fā)重分配:采用復(fù)制算法將要回收的對(duì)象復(fù)制到未使用的內(nèi)存塊中,并維護(hù)一個(gè)轉(zhuǎn)發(fā)表,記錄舊對(duì)象到新對(duì)象之間的關(guān)系。

并發(fā)重映射:修正并發(fā)重分配階段指向舊對(duì)象的所有引用,這個(gè)過(guò)程不是很迫切,一般會(huì)等到下一次GC時(shí)會(huì)重新遍歷一次一起修復(fù)。

?

?2.4 顏色指針和讀屏障

?顏色指針,ZGC的核心設(shè)計(jì)之一,以前的GC信息保存在對(duì)象頭上,現(xiàn)在保存在指針上。

可以支持2^42=4T內(nèi)存。

每個(gè)對(duì)象有一個(gè)64位指針,這64位被分為:
18位:預(yù)留給以后使用;
1位:Finalizable標(biāo)識(shí),此位與并發(fā)引用處理有關(guān),它表示這個(gè)對(duì)象只能通過(guò)finalizer才能訪問(wèn);
1位:Remapped標(biāo)識(shí),設(shè)置此位的值后,對(duì)象未指向relocation set中(
relocation set表示需要GC的
Region集合);
1位:Marked1標(biāo)識(shí);
1位:Marked0標(biāo)識(shí),和上面的Marked1都是標(biāo)記對(duì)象用于輔助GC;
42位:對(duì)象的地址(所以它可以支持2^42=4T內(nèi)存):

?

?

原文鏈接:https://blog.csdn.net/qq_21575929/article/details/124364714

欄目分類(lèi)
最近更新