網(wǎng)站首頁(yè) 編程語(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/Mainhttp://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
相關(guān)推薦
- 2023-03-23 Python?shutil模塊實(shí)現(xiàn)文件的裁剪、壓縮與解壓縮的方法_python
- 2022-05-29 利用Python將list列表寫(xiě)入文件并讀取的方法匯總_python
- 2022-12-21 Redis數(shù)據(jù)庫(kù)原理深入刨析_Redis
- 2021-12-01 docker網(wǎng)絡(luò)配置過(guò)程詳解介紹_Android
- 2022-11-30 CTF?AWD入門(mén)學(xué)習(xí)手冊(cè)_安全相關(guān)
- 2021-12-02 Postman?使用指南及小技巧_相關(guān)技巧
- 2022-09-29 ASP.NET?MVC實(shí)現(xiàn)多選下拉框保存并顯示_實(shí)用技巧
- 2022-06-11 MSSQL基本語(yǔ)法及實(shí)例操作語(yǔ)句_MsSql
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支