G1垃圾收集器在JDK1.7中投入使用弊添,并作為JDK1.9默認(rèn)的垃圾收集器。
JVM配置開啟G1參數(shù):
-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200
一油坝、G1與CMS相比有什么區(qū)別?
1.內(nèi)存碎片
CMS是一款“標(biāo)記--清除”算法實(shí)現(xiàn)的收集器免钻,容易出現(xiàn)大量空間碎片
G1通過將內(nèi)存空間分成區(qū)域(Region)的方式避免內(nèi)存碎片問題。 整體是標(biāo)記整理崔拥,Region之間通過復(fù)制算法凤覆,都不會(huì)產(chǎn)生內(nèi)存碎片
2.停頓時(shí)間
G1可以通過設(shè)置預(yù)期停頓時(shí)間(Pause Time)來控制垃圾收集時(shí)間。
3.回收范圍
G1能同時(shí)回收老年代和新生代盯桦,CMS是老年代收集器。
4.內(nèi)存劃分
Eden, Survivor, Old區(qū)不再固定拥峦、在內(nèi)存使用效率上來說更靈活
二、堆存儲(chǔ)結(jié)構(gòu)
1.以往的垃圾回收算法堆結(jié)構(gòu)
新生代:eden space + 2個(gè)survivor
老年代:old space
持久代:1.8之前的perm space
元空間:1.8之后的metaspace
這些space必須是地址連續(xù)的空間略号。
2.G1垃圾回收算法堆結(jié)構(gòu)
堆內(nèi)存被劃分為多個(gè)大小相等的內(nèi)存塊(Region),每個(gè)Region是邏輯連續(xù)的一段內(nèi)存
E:eden區(qū)
S:serviver區(qū)
O:old區(qū)
H:humongous(巨型對(duì)象)
當(dāng)新建對(duì)象大小超過Region大小一半時(shí)玄柠,直接在新的一個(gè)或多個(gè)連續(xù)Region中分配,并標(biāo)記為H羽利。
Region
堆內(nèi)存中一個(gè)Region的大小可以通過-XX:G1HeapRegionSize參數(shù)指定,大小區(qū)間只能是1M这弧、2M娃闲、4M、8M皇帮、16M和32M,總之是2的冪次方玲献,如果G1HeapRegionSize為默認(rèn)值,則在堆初始化時(shí)計(jì)算Region的實(shí)際大小捌年。
默認(rèn)把堆內(nèi)存按照2048份均分瓢娜,最后得到一個(gè)合理的大小礼预。
三、GC模式
young gc托酸、mixed gc 和 full gc,在不同的條件下被觸發(fā).
young gc
發(fā)生條件:
1.年輕代
2.除了巨型對(duì)象外的一般對(duì)象
3.eden region 被耗盡無法申請(qǐng)到內(nèi)存
young gc結(jié)果:
活躍對(duì)象被拷貝到S區(qū)或者晉升到O區(qū)
young gc JVM參數(shù):
-XX:MaxGCPauseMillis 設(shè)置G1收集過程目標(biāo)時(shí)間,默認(rèn)值200ms
-XX:G1NewSizePercent 新生代最小值励堡,默認(rèn)值5%
-XX:G1MaxNewSizePercent 新生代最大值,默認(rèn)值60%
mixed gc:
發(fā)生條件:
晉升到O區(qū)的對(duì)象越來越多应结,為了避免內(nèi)存耗盡。當(dāng)達(dá)到一定的閥值觸發(fā)鹅龄,相關(guān)JVM參數(shù):
XX:InitiatingHeapOccupancyPercent=60
當(dāng)老年代大小占整個(gè)堆大小百分比達(dá)到該閾值時(shí)揩慕,會(huì)觸發(fā)一次mixed gc
類似CMS:
-XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly
young gc結(jié)果:
回收整個(gè)Y區(qū)扮休,和一部分O區(qū)$枳梗可以選擇哪些old region進(jìn)行收集,從而可以對(duì)垃圾回收的耗時(shí)時(shí)間進(jìn)行控制侨糟。
mixed gc的執(zhí)行步驟:
1.initial mark:
初始標(biāo)記過程,整個(gè)過程STW秕重,標(biāo)記了從GC Root可達(dá)的對(duì)象2.concurrent marking:
并發(fā)標(biāo)記過程不同,整個(gè)過程gc collector線程與應(yīng)用線程可以并行執(zhí)行,標(biāo)記出GC Root可達(dá)對(duì)象衍生出去的存活對(duì)象服鹅,并收集各個(gè)Region的存活對(duì)象信息3.remark:
最終標(biāo)記過程,整個(gè)過程STW百新,標(biāo)記出那些在并發(fā)標(biāo)記過程中遺漏的,或者內(nèi)部引用發(fā)生變化的對(duì)象4.clean up:
垃圾清除過程饭望,如果發(fā)現(xiàn)一個(gè)Region中沒有存活對(duì)象,則把該Region加入到空閑列表中
full gc
如果對(duì)象內(nèi)存分配速度過快铅辞,mixed gc來不及回收,導(dǎo)致老年代被填滿斟珊,就會(huì)觸發(fā)一次full gc苇倡。
G1的full gc算法就是單線程執(zhí)行的serial old gc囤踩,會(huì)導(dǎo)致異常長時(shí)間的暫停時(shí)間,需要進(jìn)行不斷的調(diào)優(yōu)堵漱,盡可能的避免full gc.