討論什么時(shí)候應(yīng)該做gc調(diào)優(yōu)及意義

一、背景

線(xiàn)上環(huán)境下麻昼,jvm經(jīng)常發(fā)生full gc奠支;運(yùn)維監(jiān)控方面,服務(wù)健康檢測(cè)不健康抚芦;用戶(hù)體驗(yàn)方面倍谜,經(jīng)常出現(xiàn)大量的慢接口調(diào)用。
經(jīng)觀察叉抡,這三者是伴隨發(fā)生的尔崔。起初,我們從慢接口入手褥民,看到接口中的慢主要是在訪(fǎng)問(wèn)數(shù)據(jù)存儲(chǔ)層的時(shí)候季春,但是去數(shù)據(jù)庫(kù)卻沒(méi)有看到任何的慢查詢(xún)?nèi)罩荆ò╩ongodb和redis);但是能解釋為什么服務(wù)不健康消返,服務(wù)假死了载弄,不再能夠消費(fèi)任何請(qǐng)求。
所以撵颊,我們就先解決導(dǎo)致接口慢的原因(gc)宇攻。

二、業(yè)務(wù)特點(diǎn)

業(yè)務(wù)上的接口 秦驯,慢大多數(shù)都是查詢(xún)類(lèi)的 尺碰,會(huì)生成大量jvm對(duì)象在堆內(nèi)存中挣棕。
先是在年輕代译隘,由young gc回收,如果年輕代的內(nèi)存不夠洛心,則會(huì)直接分配到年老代固耘。
年老代的內(nèi)存大小有限,要回收他們词身,就只有full gc了厅目。
當(dāng)然,在年輕代的對(duì)象法严,要想回收损敷,和對(duì)象的年齡也有關(guān)。

所以深啤,我們的初步思路是增大年輕代的內(nèi)存拗馒,讓對(duì)象盡可能在young gc就回收了。

目標(biāo)

  • 年輕代的對(duì)象回收溯街,呈現(xiàn)鋸齒形诱桂。
  • 最終是為了減少full gc

三洋丐、jdk8的默認(rèn)垃圾回收器ParallelGC

Parallel Scavenge + Parallel Old

  • java -XX:+PrintCommandLineFlags -version

-XX:InitialHeapSize=67108864 -XX:MaxHeapSize=1073741824 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

實(shí)際運(yùn)行的jvm參數(shù)是
java -Xms2800m -Xmx2800m -XX:SurvivorRatio=18 -XX:MaxTenuringThreshold=15 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=92 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -jar /opt/xx/xxx.jar

參考地址:
MaxTenuringThreshold 年齡大小,默認(rèn)15

SurvivorRatio 默認(rèn)8挥等,Eden占新生代的8/10友绝,F(xiàn)rom幸存區(qū)和To幸存區(qū)各占新生代的1/10。(它和-Xmn大小有關(guān))

四肝劲、jvm體系結(jié)構(gòu)

image.png

五迁客、目標(biāo)

1、降低 Minor GC 頻率

通常情況下辞槐,由于新生代空間較小哲泊,Eden 區(qū)很快被填滿(mǎn),就會(huì)導(dǎo)致頻繁 Minor GC催蝗,因此我們可以通過(guò)增大新生代空間來(lái)降低 Minor GC 的頻率切威。

可能你會(huì)有這樣的疑問(wèn),擴(kuò)容 Eden 區(qū)雖然可以減少 Minor GC 的次數(shù)丙号,但不會(huì)增加單次 Minor GC 的時(shí)間嗎先朦?

我們知道,單次 Minor GC 時(shí)間是由兩部分組成:T1(掃描新生代)和 T2(復(fù)制存活對(duì)象)犬缨。

假設(shè)一個(gè)對(duì)象在 Eden 區(qū)的存活時(shí)間為 500ms喳魏,Minor GC 的時(shí)間間隔是 300ms,那么正常情況下怀薛,Minor GC 的時(shí)間為:T1+T2刺彩。

當(dāng)我們?cè)龃笮律臻g,Minor GC 的時(shí)間間隔可能會(huì)擴(kuò)大到 600ms枝恋,此時(shí)一個(gè)存活 500ms 的對(duì)象就會(huì)在 Eden 區(qū)中被回收掉创倔,此時(shí)就不存在復(fù)制存活對(duì)象了,

所以再發(fā)生 Minor GC 的時(shí)間為:兩次掃描新生代焚碌,即 2T1畦攘。可見(jiàn)十电,擴(kuò)容后知押,Minor GC 時(shí)增加了 T1,但省去了 T2 的時(shí)間鹃骂。

通常在虛擬機(jī)中台盯,復(fù)制對(duì)象的成本要遠(yuǎn)高于掃描成本。如果在堆內(nèi)存中存在較多的長(zhǎng)期存活的對(duì)象畏线,此時(shí)增加年輕代空間静盅,反而會(huì)增加 Minor GC 的時(shí)間。

如果堆中的短期對(duì)象很多象踊,那么擴(kuò)容新生代温亲,單次 Minor GC 時(shí)間不會(huì)顯著增加棚壁。

因此,單次 Minor GC 時(shí)間更多取決于 GC 后存活對(duì)象的數(shù)量栈虚,而非 Eden 區(qū)的大小袖外。

-Xmn1500m, 之前的年輕代就500m~700m。

2魂务、降低 Full GC 的頻率

通常情況下曼验,由于堆內(nèi)存空間不足或老年代對(duì)象太多,會(huì)觸發(fā) Full GC粘姜,頻繁的 Full GC 會(huì)帶來(lái)上下文切換鬓照,增加系統(tǒng)的性能開(kāi)銷(xiāo)。

我們可以使用哪些方法來(lái)降低 Full GC 的頻率呢孤紧?

減少創(chuàng)建大對(duì)象:在平常的業(yè)務(wù)場(chǎng)景中豺裆,我們習(xí)慣一次性從數(shù)據(jù)庫(kù)中查詢(xún)出一個(gè)大對(duì)象用于 web 端顯示。 例如号显,我之前碰到過(guò)一個(gè)一次性查詢(xún)出 60 個(gè)字段的業(yè)務(wù)操作臭猜,這種大對(duì)象如果超過(guò)年輕代最大對(duì)象閾值,會(huì)被直接創(chuàng)建在老年代押蚤;
即使被創(chuàng)建在了年輕代蔑歌,由于年輕代的內(nèi)存空間有限,通過(guò) Minor GC 之后也會(huì)進(jìn)入到老年代揽碘。 這種大對(duì)象很容易產(chǎn)生較多的 Full
GC次屠。我們可以將這種大對(duì)象拆解出來(lái),首次只查詢(xún)一些比較重要的字段雳刺,如果還需要其它字段輔助查看劫灶,再通過(guò)第二次查詢(xún)顯示剩余的字段。

增大堆內(nèi)存空間:在堆內(nèi)存不足的情況下煞烫,增大堆內(nèi)存空間浑此,且設(shè)置初始化堆內(nèi)存為最大堆內(nèi)存累颂,也可以降低 Full GC 的頻率滞详。

把jvm堆內(nèi)存由2800m --> 3800m, 且兩者一樣大 -Xms3800m -Xmx3800m

3、垃圾回收器為CMS

-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=92 -XX:+UseCMSInitiatingOccupancyOnly

image.png
  • -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    新生代使用ParNew紊馏,老年代使用CMS

  • -XX:+CMSParallelRemarkEnabled
    降低標(biāo)記停頓

  • -XX:CMSInitiatingOccupancyFraction=92

參考:

六料饥、調(diào)整后的效果對(duì)比

1、full gc 頻率顯著減少

2朱监、慢接口不再劇增

3岸啡、年輕代內(nèi)存增大

  • 調(diào)整前


    image.png
  • 調(diào)整后
    年輕代的內(nèi)存呈現(xiàn)鋸齒形,說(shuō)明年輕代的對(duì)象得到了及時(shí)回收赫编。


    image.png

4巡蘸、老年代的內(nèi)存增速顯著變慢

七奋隶、總結(jié)

1、AdaptiveSizePolicy

idea在配置啟動(dòng)參數(shù)-XX:SurvivorRatio時(shí)不生效的問(wèn)題悦荒,是因?yàn)镴DK 1.8 默認(rèn)使用 UseParallelGC 垃圾回收器唯欣,該垃圾回收器默認(rèn)啟動(dòng)了 AdaptiveSizePolicy(自適應(yīng)大小策略),會(huì)根據(jù)GC的情況自動(dòng)計(jì)算計(jì)算 Eden搬味、From 和 To 區(qū)的大芯城狻;要使-XX:SurvivorRatio生效碰纬,就需要關(guān)閉該策略 -XX:-UseAdaptiveSizePolicy萍聊。

2、使用CMS時(shí)悦析,會(huì)默認(rèn)停用AdaptiveSizePolicy開(kāi)關(guān)

/ # jinfo -flag UseAdaptiveSizePolicy 8

-XX:-UseAdaptiveSizePolicy

驗(yàn)證SurvivorRatio的設(shè)置是否生效

jinfo -flag SurvivorRatio 8

-XX:SurvivorRatio=18

驗(yàn)證是否啟用了CMS垃圾回收器

jinfo -flag UseConcMarkSweepGC 8

-XX:+UseConcMarkSweepGC

3寿桨、在arthas中查看

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市强戴,隨后出現(xiàn)的幾起案子牛隅,更是在濱河造成了極大的恐慌,老刑警劉巖酌泰,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒佣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陵刹,警方通過(guò)查閱死者的電腦和手機(jī)默伍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衰琐,“玉大人也糊,你說(shuō)我怎么就攤上這事∠壑妫” “怎么了狸剃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狗热。 經(jīng)常有香客問(wèn)我钞馁,道長(zhǎng),這世上最難降的妖魔是什么匿刮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任僧凰,我火速辦了婚禮,結(jié)果婚禮上熟丸,老公的妹妹穿的比我還像新娘训措。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布绩鸣。 她就那樣靜靜地躺著怀大,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呀闻。 梳的紋絲不亂的頭發(fā)上叉寂,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音总珠,去河邊找鬼屏鳍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛局服,可吹牛的內(nèi)容都是我干的钓瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淫奔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼山涡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起唆迁,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸭丛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后唐责,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鳞溉,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鼠哥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熟菲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朴恳,死狀恐怖抄罕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情于颖,我是刑警寧澤呆贿,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站森渐,受9級(jí)特大地震影響做入,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章母,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一母蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乳怎,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至询枚,卻和暖如春违帆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背金蜀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工刷后, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渊抄。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓尝胆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親护桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子含衔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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