JVM系列筆記目錄
- 虛擬機的基礎概念
- class檔案結構
- class檔案加載程序
- jvm記憶體模型
- JVM常用指令
- GC與調優
主要內容
上一篇 JVM系列【6】GC與調優3 記錄JVM調優的概念和分析案例,這篇主要講G1垃圾回收器、三色標記演算法,
G1垃圾回收器
-
概念
G1(Garbage First)是服務端使用的垃圾回收器,用于多核、大記憶體的機器上,在大多數情況下可以實作指定的GC停頓時間,同時還保持較高的吞吐量,不同于之前的分代垃圾回收器,G1是邏輯上分代,物理上不分代,記憶體分為一個一個Region,有Eden區、Survivor區、Old區、還有Humongous區,

特點:并發回收;壓縮空閑時間不會延長GC的暫停時間;更易預測的GC暫停時間;適用不需要很高的吞吐量的場景,
優點:追求吐吞量;追求回應時間:可以對STW進行控制;靈活: 分Region回收,優先回識訓費時間少、垃圾比例高的Region,
-
CSet和RSet
CSet(Collection Set): G1一組可被回收的磁區的集合;在CSet中存活的資料會在GC程序中被移動到另一個可用磁區;CSet中的磁區可以來自Eden空間、survivor空間或者老年代;CSet中的磁區可以來自Eden空間、survivor空間或者老年代,
RSet(RememberedSet):記錄了其它Region中的物件到本region的參考;價值在于使得垃圾回收器不需要掃描整個堆就能找到誰參考了當前磁區中的物件,只需要掃描RSet即可

了解:RSet與賦值的效率,由于RSet的存在,那么每次給物件賦值參考的時候,就得做一些額外的操作,指的是在RSet中做一下額外的記錄(在GC中稱為寫屏障),這個寫屏障不等于記憶體屏障,
-
新老年代的比例
G1中新老年代的比例為5%-60%,一般不用手工指定,也不要手動指定,因為這是G1預測停頓時間的基準,G1去控制和預測STW就是通過動態調整這個比例來實作的,
-
Region有多大?
G1中Region不指定的時候,會根據實際的Heap大小來設定,取值范圍為1 2 4 8 16 32M,設定引數為
-XX:G1HeapRegionSize -
G1中的垃圾回收
分YGC、FGC、Mixed GC型別,
YGC: Eden空間不足觸發,多執行緒并發執行,
FGC:Old空間不足觸發
Mixed GC: 相當于CMS的回收程序,初始標記、并發標記、最終標記、篩選回收,觸發Mixed GC的引數是
-XX:InitiatingHeapOccupacyPercent, 默認為45%,當O區超過這個值啟動MixedGC, -
G1是并行回收是否存在FGC?
當分配物件非常快,回收不過來的情況下會產生FGC,jdk10以前是串行FullGC,之后是并行的FGC;
如何避免FGC?
降低MixedGC的觸發一直,讓MixedGC提早發生(默認是45%);擴記憶體;提高CPU性能(回收得快,業務邏輯產生物件的速度固定,垃圾回收越快,記憶體空間越大),
三色標記法
-
三色的含義:
白色指的是未被標記的物件,灰色指自身被標記,成員變數未被標記的物件,黑色指自身和成員變數都已標記完成的物件,

-
漏標
CMS和G1在垃圾標記的程序中存在一個難點:在標記物件的程序中,物件的參考關系正在發生變化,會產生漏標的現象,漏標產生的充分必要條件:在remark程序中,黑色指向了白色,如果不對黑色重新掃描,則會漏標,會把白色D物件當做沒有新參考指向從而回收掉;并發標記程序中,洗掉了所有從灰色到白色的參考,則會產生漏標,此時白色物件應該被回收,D漏標,

-
如何解決漏標
CMS用的是Incremental Update演算法, 增量更新,關注參考的增加,A->D,把黑色重新標記為灰色,下次重新掃描A的屬性,
G1用的是SATB(snapshot at the beginning),關注參考的洗掉,當B->D參考消失時,要把這個“參考”推到GC的堆疊,保證D還能被GC掃描到,
為什么G1使用STAB? 當B->D參考消失時,會把這個參考推到GC的堆疊,下次掃描時候會拿到這個參考,由于有RSet的存在,不需要掃描整個堆去查找白色的參考,效率比較高,
-
總結
CMS使用的并發標記演算法是三色標記+Incremental Update
CMS使用的并發標記演算法是三色標記+SATB
知識分享,轉載請注明出處,學無先后,達者為先!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/176987.html
標籤:Java
下一篇:JVM系列【6】GC與調優3
