一牵舵、Young gc(STW)
觸發(fā)時(shí)機(jī):eden空間不足時(shí)绰姻,G1觸發(fā)young gc回收新生代空間凰慈。
回收對(duì)象:每次young gc會(huì)選定所有新生代region,同時(shí)根據(jù)停頓時(shí)間動(dòng)態(tài)調(diào)整新生代所占region個(gè)數(shù)來控制young gc開銷钳榨。如果存在大對(duì)象舰罚,默認(rèn)也會(huì)回收Humongous region。
回收算法:整體來看屬于標(biāo)記-整理重绷,從局部region角度來看屬于復(fù)制算法沸停。
回收過程:young gc主要過程分為:
Root掃描膜毁,RS掃描昭卓,Evacuation(對(duì)象拷貝)。
二瘟滨、Mixed gc
觸發(fā)時(shí)機(jī):
主要由以下三個(gè)參數(shù)控制候醒,回收過程會(huì)詳解
InitiatingHeapOccupancyPercent(設(shè)置觸發(fā)并發(fā)標(biāo)記周期的Java堆占用閾值,默認(rèn)45)杂瘸。
G1MixedGCLiveThresholdPercent (會(huì)被MixGC的Region中存活對(duì)象占比倒淫,默認(rèn)85),old generation region中的存活對(duì)象的占比败玉,只有小于此參數(shù)敌土,才會(huì)被選入CSet,避免mixed gc大量對(duì)象復(fù)制运翼。
G1HeapWastePercent(觸發(fā)Mixed GC的可回收空間百分比返干,默認(rèn)10),在global concurrent marking結(jié)束之后血淌,我們可以知道old gen regions中有多少空間要被回收矩欠,在每次YGC之后和再次發(fā)生Mixed GC之前,會(huì)檢查垃圾占比是否達(dá)到此參數(shù)悠夯,只有達(dá)到了癌淮,才會(huì)觸發(fā)Mixed GC。
回收對(duì)象:所有新生代region和部分老年代region沦补,G1會(huì)選擇回收部分老年代region來滿足MaxGCPauseMillis(最大停頓時(shí)間)乳蓄。
回收算法:整體來看屬于標(biāo)記-整理,從局部region角度來看屬于復(fù)制算法夕膀。
回收過程:
mixed gc主要過程分為全局并發(fā)標(biāo)記和Evacuation對(duì)象拷貝栓袖,全局并發(fā)標(biāo)記結(jié)束后會(huì)觸發(fā)一次Young gc,接著進(jìn)行mixed gc(滿足條件的情況下)店诗。
- 全局并發(fā)標(biāo)記
達(dá)到InitiatingHeapOccupancyPercent閾值會(huì)觸發(fā)全局并發(fā)標(biāo)記裹刮,該階段又可以近一步細(xì)分成下面幾個(gè)步驟:
初始標(biāo)記(initial mark,STW)庞瘸。它標(biāo)記了從GC Root開始直接可達(dá)的對(duì)象捧弃。初始標(biāo)記階段借用young GC的暫停,因而沒有額外的、單獨(dú)的暫停階段违霞。
并發(fā)標(biāo)記(Concurrent Marking)嘴办。這個(gè)階段從GC Root開始對(duì)heap中的對(duì)象標(biāo)記,標(biāo)記線程與應(yīng)用程序線程并行執(zhí)行买鸽,并且收集各個(gè)Region的存活對(duì)象信息涧郊。
最終標(biāo)記(Remark,STW)眼五。標(biāo)記那些在并發(fā)標(biāo)記階段發(fā)生變化的對(duì)象妆艘,將被回收。
清除垃圾(Cleanup看幼,部分STW)批旺。 清除空Region,這個(gè)階段如果發(fā)現(xiàn)完全沒有活對(duì)象的region就會(huì)將其整體回收到可分配region列表中诵姜。 - Mixed gc(STW)
達(dá)到G1HeapWastePercent閾值會(huì)觸發(fā)Mixed gc汽煮,該階段主要做Evacuation(對(duì)象拷貝)。Evacuation階段是全暫停的棚唆。它負(fù)責(zé)把一部分region里的活對(duì)象拷貝到空region里去(并行拷貝)暇赤,然后回收原本的region的空間。Evacuation階段可以自由選擇任意多個(gè)region來獨(dú)立收集構(gòu)成收集集合(collection set宵凌,簡稱CSet)鞋囊,CSet集合中Region的選定依賴于上文中提到的停頓預(yù)測模型和G1MixedGCLiveThresholdPercent閾值,該階段并不evacuate所有有活對(duì)象的region摆寄,只選擇收益高的少量region來evacuate失暴,這種暫停的開銷就可以(在一定范圍內(nèi))可控。
mixed gc類似CMS對(duì)老年代的major gc微饥,在CMS中其規(guī)則為只要老年代連續(xù)空間大于新生代對(duì)象總大小或歷次晉升老年代平均值就進(jìn)行minor gc逗扒,否則將進(jìn)行major gc。
三欠橘、Full gc(STW)
觸發(fā)條件
1矩肩、metaspace(方法區(qū))可用空間不足。
2肃续、G1在對(duì)象復(fù)制/轉(zhuǎn)移失敗或者沒法分配足夠內(nèi)存(比如巨型對(duì)象沒有足夠的連續(xù)分區(qū)分配)時(shí)黍檩,會(huì)觸發(fā)FullGC。full gc指退化為使用serial old收集器回收的情況始锚,其為單線程STW型收集器刽酱,停頓時(shí)間可達(dá)秒級(jí),對(duì)性能影響極大瞧捌。但在jdk10版本的G1 GC會(huì)有很多優(yōu)化棵里,F(xiàn)ull CG方面润文,將提供并發(fā)標(biāo)記的Full GC方案:Parallelize Mark-Sweep-Compact。
四殿怜、其它
對(duì)象分配:
TLAB:本地線程分配緩沖典蝌,server端默認(rèn)啟用,位于Eden區(qū)头谜。當(dāng)多線程分配內(nèi)存區(qū)塊時(shí)骏掀,因?yàn)閮?nèi)存分配和初始化數(shù)據(jù)是不同的步驟,所以在分配時(shí)需要對(duì)內(nèi)存區(qū)塊上鎖柱告,由此會(huì)引發(fā)區(qū)塊鎖競爭問題截驮。此參數(shù)會(huì)讓線程預(yù)先分配一塊屬于自己的空間(64K-1M),分配時(shí)先在自己的空間上分配末荐,不足時(shí)再申請(qǐng)侧纯,這樣就不存在內(nèi)存區(qū)塊鎖的競爭新锈,提高分配效率甲脏。
Eden:正常對(duì)象分配位置。
Humongous region:大于G1HeapRegionSize閾值(region大忻冒省)的一半块请,會(huì)將對(duì)象分配到一個(gè)或多個(gè)連續(xù)的Humongous region。
參考:
https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2#
https://blog.csdn.net/qq_27529917/article/details/86664677
http://www.reibang.com/p/548c67aa1bc0