java 并g1_JVM G1详解
java程序性能
當(dāng)我們調(diào)優(yōu)java程序時(shí),通常的目標(biāo)有兩個(gè):
響應(yīng)能力 或者 吞吐量
響應(yīng)能力
響應(yīng)能力指一個(gè)程序或者系統(tǒng)對(duì)請(qǐng)求的是否能夠及時(shí)響應(yīng)。
比如:
一個(gè)桌面UI能多快的響應(yīng)一個(gè)事件;
一個(gè)網(wǎng)站能夠多快返回一個(gè)頁(yè)面請(qǐng)求;
數(shù)據(jù)庫(kù)能夠多快返回查詢(xún)的數(shù)據(jù);
對(duì)于這類(lèi)對(duì)響應(yīng)能力敏感的場(chǎng)景,長(zhǎng)時(shí)間的停頓是無(wú)法接受的。
吞吐量
吞吐量關(guān)注的是,在一個(gè)指定的時(shí)間內(nèi),最大化一個(gè)應(yīng)用的工作量。
如下方式來(lái)衡量一個(gè)系統(tǒng)吞吐量的好壞:
在一小時(shí)內(nèi)同一個(gè)事務(wù)(或者任務(wù)、請(qǐng)求)完成的次數(shù)(tps)。
數(shù)據(jù)庫(kù)一小時(shí)可以完成多少次查詢(xún);
對(duì)于關(guān)注吞吐量的系統(tǒng),卡頓是可以接受的,因?yàn)檫@個(gè)系統(tǒng)關(guān)注長(zhǎng)時(shí)間的大量任務(wù)的執(zhí)行能力,單次快速的響應(yīng)并不值得考慮。
應(yīng)用程序運(yùn)行實(shí)際/實(shí)際時(shí)間(開(kāi)始時(shí)間戳-結(jié)束時(shí)間戳)
G1 Garbage Collector
G1垃圾收集器
g1收集器是一個(gè)面向服務(wù)端的垃圾收收集器,適用于多核處理器、大內(nèi)存容量的服務(wù)端系統(tǒng)。
它滿(mǎn)足短時(shí)間gc 停頓的同時(shí)達(dá)到一個(gè)高的吞吐量。JDK7以上版本適用。
g1收集器的設(shè)計(jì)目標(biāo):
與應(yīng)用線(xiàn)程同時(shí)工作,幾乎不需要stop-the-world(與CMS類(lèi)似);
整理剩余空間,不產(chǎn)生內(nèi)存碎片;(CMS只能在full-GC時(shí),用stop-the-world整理碎片內(nèi)存)
GC停頓更加可控;
不犧牲系統(tǒng)的吞吐量;
gc不要求額外的內(nèi)存空間(CMS需要預(yù)留空間存儲(chǔ)浮動(dòng)垃圾);
G1的設(shè)計(jì)規(guī)劃,是要替換掉CMS。
G1在某些方便彌補(bǔ)了CMS的不足,比如,CMS使用的是mark-sweep算法,自然會(huì)產(chǎn)生內(nèi)存碎片;然而G1基于copying算法,高效的整理剩余內(nèi)存,而不需要使用free-list去管理內(nèi)存碎片。
另外,G1提供了更多手段,以達(dá)到對(duì)gc停頓時(shí)間可控。
之前的GC收集器對(duì)Heap的劃分:
G1對(duì)Heap的劃分:
heap被劃分為一個(gè)個(gè)相等的不連續(xù)的內(nèi)存區(qū)域(regions),每個(gè)region都有一個(gè)分代的角色:eden、survivor、old(old還有一種細(xì)分 humongous,用來(lái)存放大小超過(guò) region 50%以上的巨型對(duì)象)。
但是對(duì)每個(gè)角色的數(shù)量并沒(méi)有強(qiáng)制的限定,也就是說(shuō)對(duì)每種分代內(nèi)存的大小,可以動(dòng)態(tài)變化(默認(rèn)年輕代占整個(gè)heap的5%)。
G1最大的特點(diǎn)就是高效的執(zhí)行回收,優(yōu)先去執(zhí)行那些大量對(duì)象可回收的區(qū)域(region)。
另外,G1使用了gc停頓可預(yù)測(cè)的模型,來(lái)滿(mǎn)足用戶(hù)設(shè)定的gc停頓時(shí)間,根據(jù)用戶(hù)設(shè)定的目標(biāo)時(shí)間,g1會(huì)自動(dòng)的選擇哪些region要清楚,一次清除多少個(gè)region。
G1從多個(gè)region中復(fù)制存活的對(duì)象,然后集中放入一個(gè)region中,同時(shí)整理、清除內(nèi)存(copying收集算法)。
注意對(duì)比之前的垃圾收集器(主要是CMS):
對(duì)比使用mark-sweep的CMS,g1使用的copying算法不會(huì)造成內(nèi)存碎片;
對(duì)比ParallelScavenge(基于copying )、ParallelOld收集器(基于mark-compact-sweep),Parallel
會(huì)對(duì)整個(gè)區(qū)域做整理導(dǎo)致gc Pause會(huì)比較長(zhǎng),而g1只是特定的整理幾個(gè)region。
值得注意:g1不是一個(gè)實(shí)時(shí)的收集器,與parallelScavenge一樣,對(duì)gc 停頓時(shí)間的設(shè)置并不絕對(duì)生效,只是g1有較高的幾率保證不超過(guò)設(shè)定gc停頓時(shí)間。與之前的gc收集器對(duì)比,g1會(huì)根據(jù)用戶(hù)設(shè)定的gc停頓時(shí)間,智能評(píng)估一下哪幾個(gè)region需要被回收可以滿(mǎn)足用戶(hù)設(shè)定。
G1內(nèi)存的分配
1.TLAB(TLAB占用年輕代內(nèi)存). 默認(rèn)使用TLAB加速內(nèi)存分配,之前文章已經(jīng)講過(guò),不贅述。
2.Eden.如果TLAB不夠用,則在Eden中分配內(nèi)存生成對(duì)象。
3.Humongous.如果對(duì)象需要的內(nèi)存超過(guò)一個(gè)region的50%以上,會(huì)忽略前兩個(gè)步驟直接在老年代的humongous中分配(連續(xù)的Region)。
何時(shí)使用G1(-XX:+UseG1GC)
1.大內(nèi)存中為了達(dá)到低gc延遲.
比如:heap size >=6G,gc pause <=0.5s
2.FullGC時(shí)間太長(zhǎng),或者太頻繁。
調(diào)優(yōu)參數(shù):
-XX:MaxGCPauseMillis=200
用戶(hù)設(shè)定的最大gc 停頓時(shí)間,默認(rèn)是200ms.
-XX:InitiatingHeapOccupancyPercent=45
默認(rèn)是45,也就是heap中45%的容量被使用,則會(huì)觸發(fā)concurrent gc。
G1垃圾回收步驟詳解
G1提供了兩種GC模式,Young GC和Mixed GC,兩種都是Stop The World(STW)的
G1 Young GC(STW)
1.當(dāng)eden數(shù)據(jù)滿(mǎn)了,則觸發(fā)g1 YGC
2.并行的執(zhí)行:
YGC 將 eden region 中存活的對(duì)象拷貝到survivor,或者直接晉升到Old Region中;將Survivor Regin中存活的對(duì)象拷貝到新的Survivor或者晉升old region。
3.計(jì)算下一次YGC eden、Survivor的尺寸
G1 Mix GC
在G1 GC中,它主要是為Mixed GC提供標(biāo)記服務(wù)的,并不是一次GC過(guò)程的一個(gè)必須環(huán)節(jié)。global concurrent marking的執(zhí)行過(guò)程分為五個(gè)步驟:
初始標(biāo)記(initial mark,STW)
在此階段,G1 GC 對(duì)根進(jìn)行標(biāo)記。該階段與常規(guī)的 (STW) 年輕代垃圾回收密切相關(guān)。
根區(qū)域掃描(root region scan)
G1 GC 在初始標(biāo)記的存活區(qū)掃描對(duì)老年代的引用,并標(biāo)記被引用的對(duì)象。該階段與應(yīng)用程序(非 STW)同時(shí)運(yùn)行,并且只有完成該階段后,才能開(kāi)始下一次 STW 年輕代垃圾回收。
并發(fā)標(biāo)記(Concurrent Marking)
G1 GC 在整個(gè)堆中查找可訪(fǎng)問(wèn)的(存活的)對(duì)象。該階段與應(yīng)用程序同時(shí)運(yùn)行,可以被 STW 年輕代垃圾回收中斷
最終標(biāo)記(Remark,STW)
該階段是 STW 回收,幫助完成標(biāo)記周期。G1 GC 清空 SATB 緩沖區(qū),跟蹤未被訪(fǎng)問(wèn)的存活對(duì)象,并執(zhí)行引用處理。
清除垃圾(Cleanup,STW)
在這個(gè)最后階段,G1 GC 執(zhí)行統(tǒng)計(jì)和 RSet 凈化的 STW 操作。在統(tǒng)計(jì)期間,G1 GC 會(huì)識(shí)別完全空閑的區(qū)域和可供進(jìn)行混合垃圾回收的區(qū)域。清理階段在將空白區(qū)域重置并返回到空閑列表時(shí)為部分并發(fā)。
一、G1收集器簡(jiǎn)介G1收集器(JDK1.7u4正式出現(xiàn))
普遍存在:全內(nèi)存掃描問(wèn)題。
傳統(tǒng)的收集器不能滿(mǎn)足高內(nèi)存高cpu的要求,這才是G1產(chǎn)生的原因。
2.G1區(qū)域劃分
在G1之中不再區(qū)分所謂的年輕代、老年代內(nèi)存空間,所有的內(nèi)存空間就是一塊。但是要?jiǎng)澐殖霾煌淖訁^(qū)域。
二、G1收集策略
雖然在G1收集器里面將整個(gè)內(nèi)存區(qū)域都混合在了一起,但是其本身依然也是在小范圍內(nèi)要進(jìn)行年輕代與老年代的區(qū)分,也就是說(shuō)依然會(huì)采用不同的GC方式來(lái)處理不同的區(qū)域。
G1——年輕代有對(duì)象
G1——年輕代對(duì)象被回收
所有的垃圾內(nèi)存的保存區(qū)域有可能會(huì)被清空后重新分配。
但是老年代的處理流程不一樣了,因?yàn)槿魏螘r(shí)候如果要想標(biāo)注老年代的不用內(nèi)存空間,都需要進(jìn)行一些暫停,而G1之中的最大好處它不用進(jìn)行全內(nèi)存掃描,只需要按照區(qū)域來(lái)進(jìn)行掃描即可。
G1老年代回收
G1——老年代,標(biāo)記階段
G1——老年代,根區(qū)域掃描
G1——老年代,重新標(biāo)記階段
G1——老年代,清理、拷貝階段
G1——清理完畢
三、G1相關(guān)處理參數(shù)
清楚了G1的基本運(yùn)行原理之后,那么下面就需要進(jìn)行一些G1的配置。(需慎重使用,可能會(huì)有一些問(wèn)題出現(xiàn))
G1收集器參數(shù)
范例:使用G1回收器java -Xmx10m -Xms10m -XX:+UseG1GC -XX:+PrintGCDetails TestDemo1
G1處理和傳統(tǒng)的垃圾收集策略是不同的,關(guān)鍵的因素是它將所有的內(nèi)存進(jìn)行了子區(qū)域的劃分。
g1 對(duì)老年代回收-總結(jié):
1.并發(fā)標(biāo)記階段(Concurrent Marking Phase):
在不產(chǎn)生stop-the-world,與程序進(jìn)程并發(fā)的情況下,活躍度(可達(dá)性分析)被分析出來(lái)。
活躍度越低,代表回收的效率越高,越值得優(yōu)先回收。
2.復(fù)制、清理階段(Copying/Cleanup Phase)
年輕代、老年代在這個(gè)階段同時(shí)被回收掉。老年代被回收的region,是根據(jù)這個(gè)region的存活度來(lái)選擇的。
總結(jié)
以上是生活随笔為你收集整理的java 并g1_JVM G1详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 生态保护重要性评价之生态脆弱性评价
- 下一篇: 平行四边形符号怎么打?