網站首頁 編程語言 正文
目錄
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/Mainhttp://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
相關推薦
- 2023-04-02 GoLang函數棧的使用詳細講解_Golang
- 2022-04-03 基于QT5實現一個時鐘桌面_C 語言
- 2022-04-23 使用Docker?Compose搭建部署ElasticSearch的配置過程_docker
- 2022-12-04 Python學習之字典和集合的使用詳解_python
- 2022-07-06 C語言超詳細講解字符串函數和內存函數_C 語言
- 2022-06-28 ES6基礎語法之數組拓展_基礎知識
- 2022-10-17 一文教會你用nginx+uwsgi部署自己的django項目_python
- 2022-08-11 C#使用DoddleReport快速生成報表_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支