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

學無先后,達者為師

網站首頁 編程語言 正文

垃圾收集器G1&ZGC詳解

作者:bingtanghulu_6 更新時間: 2022-05-11 編程語言

目錄

1.G1垃圾收集器

1.1 垃圾回收過程

?1.2 G1垃圾收集分類

1.3 G1收集器核心參數手冊

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

2.1 ZGC的內存布局

?2.2 ZGC的架構NUMA模型

2.3 ZGC運作過程

?2.4 顏色指針和讀屏障

1.G1垃圾收集器

G1垃圾收集器是一款面向多CPU,大內存的垃圾收集器,內部采用region內存塊的概念,將內存塊分為多個,里面將內存塊劃分為Eden,survivor,old,humongous(大對象存儲)區域。并不是連續的區域。

------

內存劃分舉例:

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

年輕代占比默認初始值5%=4096*5%=204.8M,最大不會超過60%=4096*0.6=2457.6M

年輕代Eden:s0:s1默認=8:1:1

------

G1參數:

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

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

?

1.1 垃圾回收過程

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

并發標記(Concurrent Mark):跟CMS一樣

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

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

-XX:MaxGCPauseMillis:STW停頓時間,默認200ms

?

?1.2 G1垃圾收集分類

Minor GC:當Eden放滿內存的5%以后會計算是否超過-XX:MaxGCPauseMillis設置最大停頓時間,如果超過才會minorGC。

Mixed GC: 當老年代大小超過(-XX:InitiatingHeapOccupancyPercent)設置的值時會回收所有的年輕代和部分老年代對象,大對象也會回收。默認45%

Full GC:如果沒有足夠的空間用來復制老年代對象時會觸發Full GC會使用單線程收集垃圾對象。

1.3 G1收集器核心參數手冊

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

?

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

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

?ZGC的目標:

1.支持TB級別的JVM,現支持4TB-16TB

2.STW停頓時間10ms以內

3.奠定未來GC的基礎

4.最糟糕的情況下吞吐量會下降15%,可以通過擴容解決。

-----

ZGC觸發時機
ZGC目前有4種機制觸發GC:
定時觸發,默認為不使用,可通過ZCollectionInterval參數配置。
預熱觸發,最多三次,在堆內存達到10%、20%、30%時觸發,主要時統計GC時間,為其他GC機制使用。
分配速率,基于正態分布統計,計算內存99.9%可能的最大分配速率,以及此速率下內存將要耗盡的時間點,
在耗盡之前觸發GC(耗盡時間 - 一次GC最大持續時間 - 一次GC檢測周期時間)。
主動觸發,(默認開啟,可通過ZProactive參數配置) 距上次GC堆內存增長10%,或超過5分鐘時,對比距上
次GC的間隔時間跟(
49 * 一次GC的最大持續時間),超過則觸發。

?

2.1 ZGC的內存布局

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

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

?

?2.2 ZGC的架構NUMA模型

UMA:多個CPU只有一個內存條,在訪問時需要涉及到內存的競爭,有鎖就會影響效率。

NUMA:每個CPU都有一塊內存。

2.3 ZGC運作過程

并發標記:跟G1的類似,只是在下圖初始標記和最終標記有一段些微的停頓。

并發預備重分配:計算要回收的對象

并發重分配:采用復制算法將要回收的對象復制到未使用的內存塊中,并維護一個轉發表,記錄舊對象到新對象之間的關系。

并發重映射:修正并發重分配階段指向舊對象的所有引用,這個過程不是很迫切,一般會等到下一次GC時會重新遍歷一次一起修復。

?

?2.4 顏色指針和讀屏障

?顏色指針,ZGC的核心設計之一,以前的GC信息保存在對象頭上,現在保存在指針上。

可以支持2^42=4T內存。

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

?

?

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

欄目分類
最近更新