关于GC 中G1的一些整理
文章目錄
- G1 垃圾回收器
- G1 中的幾個基本概念
- G1 他具有的特點
- 再次說下SATB
- 補充
- 啟動注意
- 常用啟動參數(shù)
G1 垃圾回收器
英文入門 oracle 官方指導(dǎo)
官方入門文檔。
The Garbage First Garbage Collector (G1 GC) is the low-pause, server-style generational garbage collector for Java HotSpot VM. The G1 GC uses concurrent and parallel phases to achieve its target pause time and to maintain good throughput. When G1 GC determines that a garbage collection is necessary, it collects the regions with the least live data first (garbage first).
第一句話就簡明的說明了G1 是干嘛的以及適用場景
大致意思就是 G1是針對hotspot 的一個運行再服務(wù)器端的分代垃圾回收器。它是并發(fā)和并行來運行確保低耗時和較高吞吐量。當(dāng)要收集垃圾時候是從活動數(shù)據(jù)最少的區(qū)域(垃圾優(yōu)先)開始的。
G1 中的幾個基本概念
- CSet 需要被回收的對象都放到這個cset中去
- RSet 在每一個Region中都有一個set用于記錄其他regoin中的對象對本region中的對象的引用
G1 他具有的特點
- 內(nèi)存區(qū)域不是固定的
G1 的理論上是分代模型,但是實際物理地址中不是分代的。再物理上G1將內(nèi)存區(qū)域分為多個Region【1mb,2mb,最大32mb,這個是可以通過參數(shù)進(jìn)行配置的】,每一塊region都可以是新生代或者老年代,它不是固定的。每一個region分代都不是連續(xù)的,可能當(dāng)前region是新生代,緊接著他的下一個region可能就是老年代,而再下一個可能又是新生代了。再G1中對于大對象是有多個連續(xù)的的region進(jìn)行保存的,humongous這個中連續(xù)的region的名稱,它可能占有了2個region或者3個region甚至更多,但是humongous的region都是連續(xù)的。
- 并發(fā)標(biāo)記,并發(fā)收集
- 壓縮空閑空間不會延長GC的暫停時間。
- 更易預(yù)測GC的暫停時間
- 適用于不需要非常高吞吐量的場景【比如需要很快的響應(yīng)時間場景】
再次說下SATB
G1是用satb算法進(jìn)行漏標(biāo)垃圾回收的:
我們都是知道SATB 是在指向被刪除或者消失后,不會真正的把引用刪掉而是把引用push到了GC的堆棧中。再次掃描標(biāo)記時拿到這個引用再重新掃描引用指向的白塊;但是G1中有RSet的存在,只用在RSet中查找相應(yīng)的引用,就可以不需要重新掃描所有引用指向的白塊,這樣就大大的提升了掃描效率,也就是SATB 配合RSet
簡述一下流程:
1.當(dāng)灰色A指向白色B的引用 a 被刪除時會將a這個引用push到GC的堆棧中去
2.重標(biāo)記階段獲取到堆棧中的a引用,通過a查看B所在的Region中的RSet看看是否有引用指向這個對象,要是沒有引用指向這個對象,這時從GC堆棧中刪除這個a引用并清理掉這個對象B。
所以G1的重標(biāo)記階段是很快就完成的,不用對所有堆掃描看是否還有引用指向B。通過RSet即可看到。
在三色標(biāo)記算法中說了一下SATB配合寫屏障來使用的。并沒有這么詳細(xì)。但是三色標(biāo)記是基礎(chǔ)。
補充
要知道G1 的ygc 是針對理論年輕代執(zhí)行的GC操作,但是老年代執(zhí)行的GC操作叫mixed gc,而mixed gc的過程就是三色標(biāo)記法實現(xiàn)的GC辦法。
再G1的GC 日志中可以看到很多再執(zhí)行YGC的同時伴隨著各種mark操作,所以G1中YGC與mixed GC操作是同時混合執(zhí)行的。
[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0010 secs]
啟動注意
- 運行時增加 -XX:UseG1GC 參數(shù)。
- 因為G1是動態(tài)調(diào)整Y空間與間隔YGC的時間所以不建議指定年輕代空間
- 當(dāng)GC 日志出現(xiàn)[FULL GC]時是一個很重要的需要關(guān)注的問題。需要查看回收日志,是否回收結(jié)果為0,是否存在內(nèi)存泄漏等問題。
[Full GC (Allocation Failure) 18M->18M(20M), 0.0719656 secs]
[Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38
76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]
常用啟動參數(shù)
- XX:MaxGCPauseMillis
建議值,G1會嘗試調(diào)整Young區(qū)的塊數(shù)來達(dá)到這個值 - XX:GCPauseIntervalMillis
GC的間隔時間 - XX:+G1HeapRegionSize
分區(qū)大小,建議逐漸增大該值,1 2 4 8 16 32。
隨著size增加,垃圾的存活時間更長,GC間隔更長,但每次GC的時間也會更長
ZGC做了改進(jìn)(動態(tài)區(qū)塊大小) - G1NewSizePercent
新生代最小比例,默認(rèn)為5% - G1MaxNewSizePercent
新生代最大比例,默認(rèn)為60% - GCTimeRatio
GC時間建議比例,G1會根據(jù)這個值調(diào)整堆空間 - ConcGCThreads
線程數(shù)量 - InitiatingHeapOccupancyPercent
啟動G1的堆空間占用比例
總結(jié)
以上是生活随笔為你收集整理的关于GC 中G1的一些整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react插入html
- 下一篇: 行业利差构建总结