GZIP造成JAVA Native Memory泄漏案例

本文原載于Elastic中文社區(qū): https://elasticsearch.cn/publish/article/178

近期公司某個(gè)線上JAVA應(yīng)用出現(xiàn)內(nèi)存泄漏問題绰疤,整個(gè)排查過程頗費(fèi)周折脂信,前后耗費(fèi)了近2周才定位到問題根源并予以修復(fù)。排查問題過程中在網(wǎng)上翻查了大量的資料,發(fā)現(xiàn)國內(nèi)幾乎沒有文章能對(duì)同類問題做透徹的分析和找到問題真正根源的儒恋。即使國外的各類博客和文章湖笨,也少有正確的分析。因此感覺有必要對(duì)問題根源和相關(guān)案例做一個(gè)總結(jié)灵寺,希望能為國內(nèi)開發(fā)者避免踩上同類陷阱提供一些幫助曼库。

開門見山,先列一下收集到的同類問題案例集:

這些案例涉及到的不乏一些流行的開源軟件如Lucene, Elasticsearch, Kafka略板,并且某些Bug版本在大量公司有線上部署毁枯。這些案例的問題根源都驚人的一致,即在JAVA里使用GZIP庫進(jìn)行數(shù)據(jù)流的壓縮/解壓之后叮称,忘記調(diào)用流的close()方法种玛,從而造成native memory的泄漏。

關(guān)于這類問題的分析方法和工具瓤檐,上面收集的案例集里有非常詳盡的描述赂韵,這里就不再班門弄斧一一贅述了。只結(jié)合我們自己的案例距帅,做一個(gè)比較簡(jiǎn)短的介紹和總結(jié)右锨。

我們公司這個(gè)案例的排查之所以花了近2個(gè)禮拜,其中一個(gè)重要原因是這個(gè)應(yīng)用是通過Docker部署的碌秸。應(yīng)用上線運(yùn)行一段時(shí)間后绍移,會(huì)被Docker的OOM killer給Kill掉,查看JVM監(jiān)控?cái)?shù)據(jù)卻發(fā)現(xiàn)Heap使用得很少讥电,甚至都沒有old GC發(fā)生過蹂窖,top里看這個(gè)JAVA進(jìn)程的RSS內(nèi)存占用遠(yuǎn)高于分配的Heap大小。很自然的恩敌,研發(fā)人員第一反應(yīng)是底層系統(tǒng)的問題瞬测,注意力被轉(zhuǎn)移到研究各種Docker內(nèi)存相關(guān)的參數(shù)上。 而我知道ElasticCloud曾經(jīng)也被某些版本的linux內(nèi)核bug困擾,docker可能會(huì)誤殺JVM (參見Memory Issues We'll Remember)月趟,bug的內(nèi)核版本和docker版本和我們線上部署的又很接近灯蝴,因此這個(gè)內(nèi)核bug也被加入到了懷疑列表中。 事后證明這個(gè)方向是錯(cuò)誤的孝宗,浪費(fèi)了一些時(shí)間穷躁。

在一段時(shí)間排查無果后,為了縮小排查范圍因妇,我們決定將這個(gè)應(yīng)用部署到VM上做對(duì)比測(cè)試问潭。結(jié)果內(nèi)存泄漏問題依然存在,因而排除掉了Linux內(nèi)核和docker本身的問題婚被。

同期也參考過一篇關(guān)于DirectByteByffer造成堆外內(nèi)存泄漏問題的分析博客狡忙,JVM源碼分析之堆外內(nèi)存完全解讀,考慮到問題現(xiàn)象和我們類似址芯,我們的應(yīng)用也有用到netty灾茁,DBB泄漏也被列為懷疑對(duì)象。然而在JVM啟動(dòng)里參數(shù)里對(duì)MaxDirectMemorySize做了限制后是复,經(jīng)過一段時(shí)間對(duì)外服務(wù)删顶,JAVA進(jìn)程的RSS仍然會(huì)遠(yuǎn)超過HEAP + MDM設(shè)置的大小。

這期間我們也使用過NMT工具分析HEAP內(nèi)存占用情況淑廊,然而這個(gè)工具報(bào)告出來的內(nèi)存遠(yuǎn)小于RSS逗余,也就是說這多出來的內(nèi)存并沒有被JVM本身用到,泄漏的是native memory季惩。 JAVA應(yīng)用產(chǎn)生native memory泄漏通常是在使用某些native庫時(shí)造成的录粱,因此注意力轉(zhuǎn)移到JNI。

最終幫助我們找到正確方向的是開頭列的 Debugging Java Native Memory Leaks 這篇由Twitter工程師寫的博客画拾。 博客里介紹了如何使用jemalloc來替換glibc的malloc啥繁,通過攔截和追蹤JVM對(duì)native memory的分配申請(qǐng),從而可以分析出HEAP以外的內(nèi)存分配由哪些方法調(diào)用產(chǎn)生的青抛。博客里提到產(chǎn)生泄漏的原因是忘記關(guān)閉GZIPOutputStream旗闽,巧合的是我們線上應(yīng)用也使用了gzip壓縮服務(wù)請(qǐng)求數(shù)據(jù),于是查看了一下相關(guān)的代碼蜜另,果然發(fā)現(xiàn)有忘記關(guān)閉的stream适室。 找到根源后,解決問題就簡(jiǎn)單了举瑰,一行代碼修復(fù)捣辆。

對(duì)于ElasticSearch用戶,要注意的是某些版本存在這個(gè)泄漏問題此迅,對(duì)于小內(nèi)存機(jī)器上運(yùn)行的ES服務(wù)可能會(huì)有較大的影響汽畴。 可是官方?jīng)]有明確列出所有受影響的版本旧巾,只在博客里提到5.2.1修復(fù)了這些問題。 因此如果你有顧慮的話忍些,可以用top命令看一下ES JAVA進(jìn)程的RSS消耗鲁猩,如果大大于分配的HEAP,有可能就是中招啦坐昙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绳匀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炸客,更是在濱河造成了極大的恐慌,老刑警劉巖戈钢,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹仙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡殉了,警方通過查閱死者的電腦和手機(jī)开仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薪铜,“玉大人众弓,你說我怎么就攤上這事「艄浚” “怎么了谓娃?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜒滩。 經(jīng)常有香客問我滨达,道長(zhǎng),這世上最難降的妖魔是什么俯艰? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任捡遍,我火速辦了婚禮,結(jié)果婚禮上竹握,老公的妹妹穿的比我還像新娘画株。我一直安慰自己,他們只是感情好啦辐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布谓传。 她就那樣靜靜地躺著,像睡著了一般昧甘。 火紅的嫁衣襯著肌膚如雪良拼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天充边,我揣著相機(jī)與錄音庸推,去河邊找鬼常侦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贬媒,可吹牛的內(nèi)容都是我干的聋亡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼际乘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坡倔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脖含,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤罪塔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后养葵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征堪,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年关拒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佃蚜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡着绊,死狀恐怖谐算,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情归露,我是刑警寧澤洲脂,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站靶擦,受9級(jí)特大地震影響腮考,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄捕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一踩蔚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚粘,春花似錦馅闽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攀圈,卻和暖如春暴凑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赘来。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工现喳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凯傲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓嗦篱,卻偏偏與公主長(zhǎng)得像冰单,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灸促,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題诫欠。內(nèi)存泄漏大家都不陌生了,簡(jiǎn)單粗俗的講浴栽,...
    宇宙只有巴掌大閱讀 2,363評(píng)論 0 12
  • 2014-11-17 今天后軸到了荒叼,265+43郵費(fèi),德邦快遞~速度還不錯(cuò)吃度,挺快的甩挫。不過軸有點(diǎn)不理想,就是安裝鏈盤...
    VellBibi閱讀 900評(píng)論 0 0
  • 晴了好幾天 今天卻沒有太陽 在今天你在誰的身旁 所在的地方是不是充滿花香
    十豆口閱讀 232評(píng)論 0 1