記一次OOM問(wèn)題分析

大家好括饶,我是大彬~

今天給大家分享最近出現(xiàn)的OOM問(wèn)題囊咏。

上周五早上恕洲,測(cè)試同學(xué)反饋測(cè)試環(huán)境的子系統(tǒng)服務(wù)一直超時(shí),請(qǐng)求沒(méi)有響應(yīng)梅割。

收到這個(gè)問(wèn)題之后霜第,我有點(diǎn)納悶,最近這個(gè)系統(tǒng)也沒(méi)有改動(dòng)代碼邏輯户辞,怎么會(huì)突然報(bào)服務(wù)超時(shí)的問(wèn)題泌类。為避免影響測(cè)試進(jìn)度,我趕緊登陸堡壘機(jī)查看日志底燎,看看到底啥情況刃榨。

首先先看系統(tǒng)負(fù)載情況弹砚,使用top命令查看。發(fā)現(xiàn)其中某個(gè)Java進(jìn)程cpu一直持續(xù)停留在100%到200%之間喇澡。因?yàn)檫@個(gè)系統(tǒng)不涉及大量運(yùn)算的邏輯迅栅,所以可以猜到要不就是死循環(huán)的問(wèn)題,要不就是頻繁full gc導(dǎo)致晴玖。

image

查看系統(tǒng)日志發(fā)現(xiàn)读存,出現(xiàn)java.lang.OutOfMemoryError: Metaspace,很明顯呕屎,元空間內(nèi)存溢出了让簿。

接著查看系統(tǒng)gc情況,使用以下命令查看秀睛。pid為對(duì)應(yīng)的Java進(jìn)程id尔当,通過(guò)top命令獲取。參數(shù)1000表示每隔1000ms打印一次記錄蹂安。

<pre mdtype="fences" cid="n17" lang="java" spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">jstat -gc pid 1000</pre>

一看執(zhí)行結(jié)果椭迎,果不其然,full gc 從應(yīng)用程序啟動(dòng)到采樣時(shí)已經(jīng)觸發(fā)了幾百次田盈!這也是cpu一直100%的原因畜号。

image

其中還有另一個(gè)參數(shù) MC(元空間分配內(nèi)存大小)允瞧,已經(jīng)接近設(shè)置的最大元空間大屑蛉怼(配置的--XX:MaxMetaspaceSize=128m)。

這里也簡(jiǎn)單介紹下元空間述暂。

元數(shù)據(jù)是jdk8里特有的數(shù)據(jù)結(jié)構(gòu)痹升,jdk7是叫永久代,到了jdk8永久代就廢棄了畦韭,使用元空間替代疼蛾。元空間被分配在本地內(nèi)存中(非堆上),默認(rèn)不限制內(nèi)存使用艺配,可以使用 MaxMetaspaceSize 指定最大值察郁。

元空間由兩大部分組成

  • Klass Metaspace,用來(lái)存klass的妒挎,klass是class文件在jvm里的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)绳锅。
  • NoKlass Metaspace,專(zhuān)門(mén)來(lái)存klass相關(guān)的其他的內(nèi)容酝掩,比如method鳞芙,常量池等,這塊內(nèi)存是由多塊內(nèi)存組合起來(lái)的。

MC 就是Klass Metaspace以及NoKlass Metaspace兩者總共分配的內(nèi)存大小原朝,單位是KB驯嘱。上圖中,MC已經(jīng)接近元空間設(shè)置的上限值喳坠,也就是此時(shí)元空間內(nèi)存已經(jīng)不夠用了鞠评,導(dǎo)致一直觸發(fā)full gc。

然后就是dump內(nèi)存進(jìn)行分析壕鹉,看看是什么原因?qū)е碌脑臻g內(nèi)存溢出剃幌。使用命令./jmap -dump:live,format=b,file=/xxx 導(dǎo)出內(nèi)存heap到xxx位置(hprof格式),然后使用MAT工具進(jìn)行分析晾浴。

將hprof文件導(dǎo)入MAT工具负乡,打開(kāi)內(nèi)存泄漏分析(涉及公司內(nèi)部源碼,所以打了馬賽克):

image

看到這個(gè)之后脊凰,就大概知道是什么問(wèn)題了抖棘。因?yàn)樽罱緝?nèi)部在推廣一個(gè)漏洞監(jiān)控工具,需要在服務(wù)端部署agent程序狸涌,這個(gè)工具會(huì)收集切省、監(jiān)控應(yīng)用程序運(yùn)行時(shí)函數(shù)執(zhí)行、數(shù)據(jù)傳輸帕胆,可以識(shí)別常見(jiàn)的安全缺陷和漏洞朝捆。而打碼的部分正是這個(gè)漏洞監(jiān)控工具的應(yīng)用包名,很可能是引入這個(gè)工具引起的問(wèn)題惶楼!

進(jìn)一步確認(rèn)問(wèn)題右蹦。打開(kāi)Histogram:

image

Shallow Heap 代表一個(gè)對(duì)象結(jié)構(gòu)自身所占用的內(nèi)存大小诊杆,不包括其屬性引用對(duì)象所占的內(nèi)存歼捐。

Retained Heap 是一個(gè)對(duì)象被 GC 回收后,可釋放的內(nèi)存大小晨汹,等于釋放對(duì)象的 Retained Heap 中所有對(duì)象的 Shallow Heap 的和豹储。

在Histogram視圖中,選中其中一個(gè)類(lèi)點(diǎn)擊鼠標(biāo)右鍵會(huì)彈出一個(gè)菜單淘这,選擇Merge shortest paths to GC Roots剥扣,查看當(dāng)前對(duì)象到GC Root的路徑,可以過(guò)濾一些類(lèi)型的引用铝穷。

image

結(jié)果如下:

image

占用內(nèi)存空間最多的就是漏洞監(jiān)控工具的類(lèi)钠怯,也基本可以確定問(wèn)題所在了。

最后把這個(gè)漏洞監(jiān)控工具去掉之后曙聂,重新部署之后晦炊,就不會(huì)出現(xiàn)服務(wù)超時(shí)的問(wèn)題了。

以上就是本期OOM問(wèn)題分析的整個(gè)過(guò)程~


碼字不易,如果覺(jué)得對(duì)你有幫助断国,可以點(diǎn)個(gè)贊鼓勵(lì)一下贤姆!

我是程序員大彬 ,專(zhuān)注Java后端硬核知識(shí)分享稳衬,歡迎大家關(guān)注~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霞捡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薄疚,更是在濱河造成了極大的恐慌碧信,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街夭,死亡現(xiàn)場(chǎng)離奇詭異音婶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)莱坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)衣式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人檐什,你說(shuō)我怎么就攤上這事碴卧。” “怎么了乃正?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵住册,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓮具,道長(zhǎng)荧飞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任名党,我火速辦了婚禮叹阔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘传睹。我一直安慰自己耳幢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布欧啤。 她就那樣靜靜地躺著睛藻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邢隧。 梳的紋絲不亂的頭發(fā)上店印,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音倒慧,去河邊找鬼按摘。 笑死讥邻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的院峡。 我是一名探鬼主播兴使,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼照激!你這毒婦竟也來(lái)了发魄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俩垃,失蹤者是張志新(化名)和其女友劉穎励幼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體口柳,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苹粟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跃闹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嵌削。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖望艺,靈堂內(nèi)的尸體忽然破棺而出苛秕,到底是詐尸還是另有隱情,我是刑警寧澤找默,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布艇劫,位于F島的核電站,受9級(jí)特大地震影響惩激,放射性物質(zhì)發(fā)生泄漏店煞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一风钻、第九天 我趴在偏房一處隱蔽的房頂上張望顷蟀。 院中可真熱鬧,春花似錦魄咕、人聲如沸衩椒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至苟弛,卻和暖如春喝滞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膏秫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工右遭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓窘哈,卻偏偏與公主長(zhǎng)得像吹榴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滚婉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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