記一次Jvm old過高的排查過程

最近遇到一個Jvm old過高的案例,現(xiàn)象是一個站點的jvm old區(qū)過高,分析原因是,原來的設(shè)計方案有問題空郊,給前端返回的數(shù)據(jù)里面包含了大量的html代碼,從存儲中拿數(shù)據(jù)的過程切揭、拼接數(shù)據(jù)的過程過于漫長了狞甚,造成了大量對象的生命周期過長,對象被 標(biāo)記到了old中廓旬,造成了old區(qū)過高哼审,監(jiān)控系統(tǒng)進(jìn)行了報警,詳細(xì)原因就不做詳細(xì)分析了孕豹,主要分享一下問題排查的過程涩盾。

收到了監(jiān)控系統(tǒng)的報警,在服務(wù)器上查詢jvm內(nèi)存情況

jstat -gcutil pid 時間間隔励背,可以按時間間隔打印jvm的內(nèi)存情況,例如:

jstat  -gcutil  30922 1000
jvm進(jìn)程30922的內(nèi)存情況

大致說一下春霍,S0,S1這些的含義:

S0:年輕代中第一個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
S1:年輕代中第二個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
E: 年輕代中Eden(伊甸園)已使用的占當(dāng)前容量百分比
O: old代已使用的占當(dāng)前容量百分比
P: perm代已使用的占當(dāng)前容量百分比
YGC: 從應(yīng)用程序啟動到采樣時年輕代中g(shù)c次數(shù)
YGCT:從應(yīng)用程序啟動到采樣時年輕代中g(shù)c所用時間(s)
FGC: 從應(yīng)用程序啟動到采樣時old代(全gc)gc次數(shù)
FGCT:從應(yīng)用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT: 從應(yīng)用程序啟動到采樣時gc用的總時間(s)

從內(nèi)存情況,來看椅野,S0终畅、伊甸園已經(jīng)被打滿,old已經(jīng)被打滿竟闪,排除了是大對象實例過多直接把old打滿的情況离福,繼續(xù)分析

查看應(yīng)用啟動的jvm參數(shù)

-Xms2g -Xmx2g -Xmn1g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80

說兩個參數(shù)的含義吧
XX:SurvivorRatio=4,這個參數(shù)的意思是Survivor兩個區(qū)與新生代的比例炼蛤,設(shè)置為4的意思是兩個區(qū)與新生代的比例為2:4妖爷,MaxTenuringThreshold=10, 這個參數(shù)的意思是對象標(biāo)記多少次后記為old對象,放入到老年代中理朋,設(shè)置為10就是新生代對象被標(biāo)記10次還沒有釋放絮识,就放到老年代中,從參數(shù)上看嗽上,造成old區(qū)過高報警的原因是有的對象在新生代中次舌,被標(biāo)記了10次都沒有被釋放,被放入到了老年代中兽愤,造成了老年代過大彼念,F(xiàn)GC頻率過高

經(jīng)朋友指點挪圾,這一塊的分析有問題,有問題的分析留著逐沙,再貼一下朋友的分析哲思,對比一下

動態(tài)對象年齡判定:為了能更好地適應(yīng)不同程度的內(nèi)存狀況,虛擬機(jī)并不是永遠(yuǎn)地要求對象的年齡必須達(dá)到了MaxTenuringThreshold才能晉升到老年代,如果在Survivor空間中相同年齡的所有對象大小的總和大于Survivor空間的一半,年齡大于或等于年齡的對象就可以直接進(jìn)入老年代,無須等到MaxTenuringThreshold中要求的年齡


朋友的指導(dǎo)

導(dǎo)出dump文件,使用jvisualvm.exe查看

導(dǎo)出dump文件的過程就不贅述了吩案,簡單貼一下命令

jmap -dump:format=b,file=serviceDump.dat pid

jvisualvm是一個jdk自帶的內(nèi)存分析工具棚赔,一般位置在jdk安裝目錄下:

C:\Program Files\Java\jdk1.8.0_141\bin\jvisualvm.exe
jvisualvm工具界面

在這選擇已經(jīng)導(dǎo)出的dump文件,查看內(nèi)存中類的實例數(shù)徘郭、實例大小


查看類的實例數(shù)

發(fā)現(xiàn)是Char[],String,HashMap這三個的實例是jvm中最多的靠益,實例數(shù)分別占31%、30.9%崎岂、30.2%捆毫,總共占了92.1%,實例的大小分別占35.8%冲甘、14.6%、22.4%途样,總共占了72.8%江醇,主要是這三個類的實例占用過大的內(nèi)存

查看Char[]的實例信息

點擊去,查看Char[]的實例信息何暇,從大到小的排列


有一些實例比別的實例大很多

查看最大的這些實例陶夜,發(fā)現(xiàn)這些實例里面的內(nèi)容是

<graph lineThickness='3' showValues='0' formatNumberScale='1' anchorRadius='3' divLineAlpha='20' divLineColor='CC3300' divLineIsDashed='1' showAlternateHGridColor='1' alternateHGridAlpha='5' alternateHGridColor='CC3300' shaowAlpha='40d' chartRightMargin='3..

目測這些都是前端使用的圖表所用到的數(shù)據(jù),設(shè)計不合理裆站,這些圖表的html代碼由后臺代碼給前端返回了


實例里面的內(nèi)容

查看這些實例的堆棧信息

查看這些實例的垃圾回收根節(jié)點


查看這些實例的垃圾回收根節(jié)點

發(fā)現(xiàn)是根節(jié)點是 StringBuilder對象条辟,查看堆棧信息


查看堆棧信息

堆棧信息

通過堆棧信息,就定位到了代碼中宏胯,分析代碼羽嫡,原因基本是,原來的設(shè)計方案有問題肩袍,給前端返回的數(shù)據(jù)里面包含了大量的html代碼杭棵,從存儲中拿數(shù)據(jù)的過程、拼接數(shù)據(jù)的過程過于漫長了氛赐,造成了大量對象的生命周期過長魂爪,對象被 標(biāo)記到了old中,造成了old區(qū)過高艰管,這里就是是分享下滓侍,排查的過程,不對原因過于詳細(xì)的表述了

這次排查問題的過程就為大家分享到這里牲芋,歡迎大家來交流撩笆,指出文中一些說錯的地方尔破,讓我加深認(rèn)識,愿大家沒有bug浇衬,謝謝懒构!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耘擂,隨后出現(xiàn)的幾起案子胆剧,更是在濱河造成了極大的恐慌,老刑警劉巖醉冤,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秩霍,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚁阳,警方通過查閱死者的電腦和手機(jī)铃绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螺捐,“玉大人颠悬,你說我怎么就攤上這事《ㄑ” “怎么了赔癌?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澜沟。 經(jīng)常有香客問我灾票,道長,這世上最難降的妖魔是什么茫虽? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任刊苍,我火速辦了婚禮,結(jié)果婚禮上濒析,老公的妹妹穿的比我還像新娘正什。我一直安慰自己,他們只是感情好悼枢,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布埠忘。 她就那樣靜靜地躺著,像睡著了一般馒索。 火紅的嫁衣襯著肌膚如雪莹妒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天绰上,我揣著相機(jī)與錄音旨怠,去河邊找鬼。 笑死蜈块,一個胖子當(dāng)著我的面吹牛鉴腻,可吹牛的內(nèi)容都是我干的迷扇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼爽哎,長吁一口氣:“原來是場噩夢啊……” “哼蜓席!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起课锌,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤厨内,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渺贤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雏胃,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年志鞍,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞭亮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡固棚,死狀恐怖统翩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玻孟,我是刑警寧澤唆缴,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站黍翎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艳丛。R本人自食惡果不足惜匣掸,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氮双。 院中可真熱鬧碰酝,春花似錦、人聲如沸戴差。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暖释。三九已至袭厂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間球匕,已是汗流浹背纹磺。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留亮曹,地道東北人橄杨。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓秘症,卻偏偏與公主長得像,于是被迫代替她去往敵國和親式矫。 傳聞我的和親對象是個殘疾皇子乡摹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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

  • jvm原理 Java虛擬機(jī)是整個java平臺的基石聪廉,是java技術(shù)實現(xiàn)硬件無關(guān)和操作系統(tǒng)無關(guān)的關(guān)鍵環(huán)節(jié),是java...
    AI喬治閱讀 17,225評論 21 486
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理氏义,因此不免有一些不準(zhǔn)確的地方锄列,同時不同JDK版本的...
    高廣超閱讀 15,564評論 3 83
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory它呀,是指程序在申請內(nèi)存時劲够,沒有足夠的內(nèi)存空間供其使用,...
    Aimerwhy閱讀 732評論 0 1
  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,195評論 0 7
  • 車到站了峦失,安靜的停歇著克婶,空響的旁邊掠過的列車筒严,急匆匆的奔跑而去。 這一次情萤,我流淚了鸭蛙。 看這短暫的人生,就像看完了自...
    少閣閱讀 561評論 0 0