- 虛擬機的基礎概念
- class文件結構
- class文件加載過程
- jvm內存模型
- JVM經常使用指令
- GC與調優
上一篇 JVM系列【6】GC與調優3 記錄JVM調優的概念和分析案例。這篇主要講G1垃圾回收器、三色標記算法。算法
G1(Garbage First)是服務端使用的垃圾回收器,用於多核、大內存的機器上,在大多數狀況下能夠實現指定的GC停頓時間,同時還保持較高的吞吐量。不一樣於以前的分代垃圾回收器,G1是邏輯上分代,物理上不分代。內存分爲一個一個Region,有Eden區、Survivor區、Old區、還有Humongous區。多線程
特色:併發回收;壓縮空閒時間不會延長GC的暫停時間;更易預測的GC暫停時間;適用不須要很高的吞吐量的場景。併發
優勢:追求吐吞量;追求響應時間:能夠對STW進行控制;靈活: 分Region回收,優先回收花費時間少、垃圾比例高的Region。jvm
CSet(Collection Set): G1一組可被回收的分區的集合;在CSet中存活的數據會在GC過程當中被移動到另外一個可用分區;CSet中的分區能夠來自Eden空間、survivor空間或者老年代;CSet中的分區能夠來自Eden空間、survivor空間或者老年代。性能
RSet(RememberedSet):記錄了其它Region中的對象到本region的引用;價值在於使得垃圾回收器不須要掃描整個堆就能找到誰引用了當前分區中的對象,只須要掃描RSet便可spa
瞭解:RSet與賦值的效率,因爲RSet的存在,那麼每次給對象賦值引用的時候,就得作一些額外的操做,指的是在RSet中作一下額外的記錄(在GC中稱爲寫屏障),這個寫屏障不等於內存屏障。.net
G1中新老年代的比例爲5%-60%,通常不用手工指定,也不要手動指定,由於這是G1預測停頓時間的基準,G1去控制和預測STW就是經過動態調整這個比例來實現的。線程
G1中Region不指定的時候,會根據實際的Heap大小來設定,取值範圍爲1 2 4 8 16 32M,設置參數爲-XX:G1HeapRegionSize
code
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
知識分享,轉載請註明出處。學無前後,達者爲先!