掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
相信大家都有感觸,線上服務(wù)內(nèi)存OOM的問題,是最難定位的問題,不過歸根結(jié)底,最常見的原因:

漳縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,漳縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為漳縣近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的漳縣做網(wǎng)站的公司定做!
58到家架構(gòu)部,運(yùn)維部,58速運(yùn)技術(shù)部聯(lián)合進(jìn)行了一次線上服務(wù)內(nèi)存OOM問題排查實(shí)戰(zhàn)演練,將內(nèi)存OOM問題定位三板斧分享出來,希望對大家也有幫助。
題目
某服務(wù)器上部署了Java服務(wù)一枚,出現(xiàn)了OutOfMemoryError,請問有可能是什么原因,問題應(yīng)該如何定位?
不妨設(shè)服務(wù)進(jìn)程PID為10765(沒錯,就是CPU占用高的那個倒霉的進(jìn)程《線上服務(wù)CPU100%問題快速定位實(shí)戰(zhàn)》)。
解決思路
Java服務(wù)OOM,最常見的原因?yàn)椋?/p>
更具體的,可以使用以下的一些工具逐一排查。
一、確認(rèn)是不是內(nèi)存本身就分配過小
方法:
- jmap -heap 10765
如上圖,可以查看新生代,老生代堆內(nèi)存的分配大小以及使用情況,看是否本身分配過小。
二、找到最耗內(nèi)存的對象
方法:
- jmap -histo:live 10765 | more
圖示:
如上圖,輸入命令后,會以表格的形式顯示存活對象的信息,并按照所占內(nèi)存大小排序:
是不是很直觀?對于實(shí)例數(shù)較多,占用內(nèi)存大小較多的實(shí)例/類,相關(guān)的代碼就要針對性review了。
上圖中占內(nèi)存最多的對象是RingBufferLogEvent,共占用內(nèi)存18M,屬于正常使用范圍。
如果發(fā)現(xiàn)某類對象占用內(nèi)存很大(例如幾個G),很可能是類對象創(chuàng)建太多,且一直未釋放。例如:
三、確認(rèn)是否是資源耗盡
工具:
查看進(jìn)程創(chuàng)建的線程數(shù),以及網(wǎng)絡(luò)連接數(shù),如果資源耗盡,也可能出現(xiàn)OOM。
這里介紹另一種方法,通過
可以分別查看句柄詳情和線程數(shù)。
例如,某一臺線上服務(wù)器的sshd進(jìn)程PID是9339,查看
如上圖,sshd共占用了四個句柄
sshd只有一個主線程PID為9339,并沒有多線程。
所以,只要
就能知道進(jìn)程打開的句柄數(shù)和線程數(shù)。
作業(yè)
對線上服務(wù)器的一臺tomcat,查看proc下的fd目錄和task目錄,特別是對于句柄fd目錄的查詢,有意想不到的驚喜喲,一定要動手試試哈。
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流