JVM GC調(diào)優(yōu)

目標(biāo)

滿足應(yīng)用的響應(yīng)時(shí)間和吞吐量需求够掠,盡量減少GC對(duì)應(yīng)用的影響

原則

  1. 大部分時(shí)候都不需要調(diào)優(yōu)GC,只需配置-Xms贾陷,-Xmx即可逮京,JVM會(huì)自動(dòng)進(jìn)行調(diào)整
  2. 先滿足響應(yīng)時(shí)間需求卿堂,再滿足吞吐量需求
  3. FullGC對(duì)應(yīng)用的影響更大,要盡量減少FullGC執(zhí)行的時(shí)間和頻率懒棉,減少轉(zhuǎn)移到Old的對(duì)象數(shù)量

監(jiān)控GC狀態(tài)

  • 查看一下GC的總體執(zhí)行情況
jstat -gcutil pid
參數(shù) 說明
YGC Minor GC執(zhí)行的次數(shù)
YGCT Minor GC執(zhí)行的總耗時(shí)
YGCT/YGC Minor GC平均耗時(shí)
FGC Full GC執(zhí)行的次數(shù)
FGCT Full GC執(zhí)行的總耗時(shí)
FGCT/FGC Full GC平均耗時(shí)
  • 查看一下GC執(zhí)行的頻率和詳細(xì)情況
    在命令行中加入-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename
    查看GC日志中每次GC的間隔時(shí)間草描,即可得出GC執(zhí)行的頻率
    也可以使用GcViewer工具,導(dǎo)入GC日志策严,進(jìn)行更詳細(xì)的分析(趨勢(shì)分析穗慕,什么時(shí)間段GC執(zhí)行得更頻繁,耗時(shí)更多等)

分析監(jiān)控結(jié)果

分析GC結(jié)果妻导,確定是否需要調(diào)優(yōu)逛绵,可參考以下標(biāo)準(zhǔn)(實(shí)際標(biāo)準(zhǔn)以應(yīng)用的實(shí)際情況為準(zhǔn))

  • Minor GC平均耗時(shí)少于50毫秒
  • Minor GC平均頻率少于10秒
  • Full GC平均耗時(shí)少于1秒
  • Full GC平均頻率少于10分鐘

當(dāng)出現(xiàn)OutOfMemoryError時(shí),要確定是什么問題倔韭,是內(nèi)存分配不足還是因?yàn)閮?nèi)存泄漏或者沒有及時(shí)术浪,可以通過jmap命令或者在命令行加入-XX:+HeapDumpOnOutOfMemoryError,然后對(duì)dump出的Heap進(jìn)行分析(可以使用MAT或者jvisualvm工具)

調(diào)優(yōu)GC

基本策略

  1. 調(diào)整Heap中各區(qū)的大小寿酌,目標(biāo)是尋找一個(gè)平衡點(diǎn)胰苏,在不發(fā)生OutOfMemoryError的情況下,滿足應(yīng)用響應(yīng)時(shí)間和吞吐量的需求
    增大內(nèi)存份名,可以減少GC執(zhí)行頻率,但會(huì)增加GC執(zhí)行時(shí)間
    減少內(nèi)存妓美,可以減少GC執(zhí)行時(shí)間僵腺,但會(huì)增加GC執(zhí)行頻率

  2. 內(nèi)存不作動(dòng)態(tài)調(diào)整,因?yàn)槊看握{(diào)整內(nèi)存(Heap或Perm)都會(huì)觸發(fā)FullGC
    -Xms和-Xmx設(shè)置成相同(整個(gè)Heap大小不變)
    設(shè)置-Xmn(Young區(qū)大小不變壶栋,從而Old區(qū)的大小也不變)
    設(shè)置-XX:SurvivorRatio(Eden辰如、兩個(gè)Survivor大小不變)
    -XX:PermSize和-XX:MaxPermSize設(shè)置成相同(Perm區(qū)大小不變)

  3. 避免主動(dòng)觸發(fā)GC
    程序調(diào)用了System.gc方法,會(huì)觸發(fā)FullGC
    在命令行中加入-XX:+DisableExplicitGC贵试,可以忽略主動(dòng)GC的調(diào)用

響應(yīng)時(shí)間調(diào)優(yōu)

  1. 使用-XX:+UseParallelOldGC策略

  2. 觀察Minor GC的頻率和耗時(shí)琉兜,確定Young大小
    確保只調(diào)整Young大小凯正,不調(diào)整Old和Perm的大小
    耗時(shí)大,則減少Eden豌蟋,頻率高則增加Eden廊散,此時(shí)Survivor大小不變
    如果耗時(shí)和頻率都合適,則保持Eden大小不變梧疲,調(diào)整Survivor大小允睹,相應(yīng)要調(diào)整Young大小,主要目的是減少?gòu)腨oung移到Old的對(duì)象數(shù)量
    觀察每次GC后是否有對(duì)象遷移到Old幌氮,如果有缭受,則增加Survivor大小或?qū)ο驛ge大小,確保將對(duì)象盡可能地留在Young(設(shè)置-XX:+PrintTenuringDistribution该互,可以看到每次GC后Survivor的大小和各個(gè)Age對(duì)象的數(shù)量米者,如果Survivor滿了,則增加Survivor大小宇智,如果Survivor未滿蔓搞,但仍有對(duì)象遷移到Old(排除大對(duì)象),則設(shè)置age=max(age)+1普筹,-XX:MaxTenuringThreshold=N[0-31])

  3. 觀察Full GC的頻率和耗時(shí)败明,確定Old大小
    確保只調(diào)整Old大小,不調(diào)整Young和Perm大小
    耗時(shí)大則減少Old太防,頻率高則增加Old
    如果調(diào)整后仍然不能滿足耗時(shí)需求妻顶,則考慮使用CMS策略。此時(shí)Old要增大20%-30%蜒车,因?yàn)镃MS會(huì)產(chǎn)生碎片讳嘱,要預(yù)留更多的內(nèi)存給應(yīng)用,否則容易產(chǎn)生concurrent mode error錯(cuò)誤酿愧,會(huì)退化成Serial回收沥潭,耗時(shí)更大。如果出現(xiàn)concurrent mode error嬉挡,可以增大Old或者減少碎片整理的百分比(-XX:CMSInitiatingOccupancyFraction=N)钝鸽,增大CMS的頻率,加快收集Old

吞吐量調(diào)優(yōu)

在滿足響應(yīng)時(shí)間的前提下庞钢,增加Young和Old的大小拔恰,然后再進(jìn)行響應(yīng)時(shí)間的分析

推薦配置

基本配置

-Xms=-Xmx
-XX:PermSize=-XX:MaxPermSize
設(shè)置-Xmn
設(shè)置-XX:SurvivorRatio
-Xss=256k(默認(rèn)是1M,一般不需要那么大基括,如果發(fā)生StackOverflowError颜懊,則增加此值)
-XX:-UseAdaptiveSizePolicy(不允許JVM動(dòng)態(tài)調(diào)整各區(qū)的大小)
-XX:+DisableExplicitGC(關(guān)閉主動(dòng)GC調(diào)用)
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:filename

CMS配置

-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+ ScavengeBeforeFullGC
-XX+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=X
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:CMSInitiatingPermOccupancyFraction=80
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市河爹,隨后出現(xiàn)的幾起案子匠璧,更是在濱河造成了極大的恐慌,老刑警劉巖咸这,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夷恍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炊苫,警方通過查閱死者的電腦和手機(jī)裁厅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侨艾,“玉大人执虹,你說我怎么就攤上這事∵肜妫” “怎么了袋励?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)当叭。 經(jīng)常有香客問我茬故,道長(zhǎng),這世上最難降的妖魔是什么蚁鳖? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任磺芭,我火速辦了婚禮,結(jié)果婚禮上醉箕,老公的妹妹穿的比我還像新娘钾腺。我一直安慰自己,他們只是感情好讥裤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布放棒。 她就那樣靜靜地躺著,像睡著了一般己英。 火紅的嫁衣襯著肌膚如雪间螟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天损肛,我揣著相機(jī)與錄音厢破,去河邊找鬼。 笑死治拿,一個(gè)胖子當(dāng)著我的面吹牛摩泪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忍啤,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼加勤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了同波?” 一聲冷哼從身側(cè)響起鳄梅,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎未檩,沒想到半個(gè)月后戴尸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冤狡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年孙蒙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲雳。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挎峦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出合瓢,到底是詐尸還是另有隱情坦胶,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布晴楔,位于F島的核電站顿苇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏税弃。R本人自食惡果不足惜纪岁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望则果。 院中可真熱鬧幔翰,春花似錦、人聲如沸短条。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茸时。三九已至贡定,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間可都,已是汗流浹背缓待。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渠牲,地道東北人旋炒。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像签杈,于是被迫代替她去往敵國(guó)和親瘫镇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鼎兽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容