Linux上Java閃退問(wèn)題定位

現(xiàn)象

java服務(wù)嫩实,運(yùn)行1-2天閃退。閃退問(wèn)題通常比較難查搏恤,因?yàn)槿罩静蝗ナ伲杂涗浺幌卤敬螁?wèn)題原因定位。

定位問(wèn)題過(guò)程

1 先看應(yīng)用日志

一般閃退都不會(huì)記錄(應(yīng)用來(lái)不及寫(xiě))熟空,但是可以碰碰運(yùn)氣看看最后在執(zhí)行什么藤巢。

2 本地排查java內(nèi)存泄漏

  • 安裝Jprofile
  • 選擇IDEA-->Perferences-->Plugins打開(kāi)安裝JProfile插件的界面
  • 下載最新JProfile壓縮包
  • 本地運(yùn)行java程序
  • 在Jprofiler選擇你要profile的進(jìn)程


    image.png
  • 選擇live memory--> mark current --> 執(zhí)行疑似內(nèi)存泄漏的操作-->點(diǎn)擊GC
    如果有對(duì)象不能被GC,則疑似發(fā)生了內(nèi)存泄漏


    image.png
  • 進(jìn)一步分析泄漏的原因息罗,右鍵選中掂咒,查看heap
    選擇不進(jìn)行GC查看前面新增的對(duì)象(勾選了GC選項(xiàng)后會(huì)再進(jìn)行一次GC,前面GC過(guò)了就不用了迈喉。)
    ** 補(bǔ)充:內(nèi)存泄漏一般看堆绍刮,棧一般存運(yùn)行時(shí)數(shù)據(jù) **


    image.png
  • 查看引用(references),show path to gc root挨摸,能看到對(duì)象的引用路徑


    image.png
  • 這里可以先合并統(tǒng)計(jì)孩革,找到最多的對(duì)象再挨個(gè)定位,要一個(gè)個(gè)查得运,找到問(wèn)題所在膝蜈。

問(wèn)題到這里查到了一些微小的內(nèi)存泄漏,但是感覺(jué)不至于服務(wù)1-2天閃退熔掺。查到了某寫(xiě)操作占用大量?jī)?nèi)存饱搏,但是可以被GC回收。需要進(jìn)一步定位置逻。

3 服務(wù)器查看系統(tǒng)日志

  • 系統(tǒng)日志一般存放在/var/log中

  • 不同的系統(tǒng)日志有不同的含義

    • /var/log/cron 工作調(diào)度
    • /var/log/dmesg 內(nèi)核檢測(cè)過(guò)程中產(chǎn)生的信息
    • /var/log/lastlog 檢測(cè)所有賬號(hào)登陸信息
    • /var/log/maillog或/var/log/mail/* 郵件
    • /var/log/messages 記錄系統(tǒng)發(fā)生的所有錯(cuò)誤信息
    • /var/log/secure 涉及賬號(hào)密碼信息
    • /var/log/wtmp,/var/log/faillog 記錄正確登陸系統(tǒng)與錯(cuò)誤登陸系統(tǒng)者的賬號(hào)信息
    • /var/log/httpd/,/var/log/news/,/var/log/samba/* 不同網(wǎng)絡(luò)服務(wù)的信息記錄處
    • /var/log/syslog (本人用的騰訊云的系統(tǒng)日志)**
  • 先從應(yīng)用日志中定位到閃退的時(shí)間(從某個(gè)時(shí)間點(diǎn)開(kāi)始沒(méi)有日志了)

  • 然后搜索一下 /var/log/syslog

  • 在閃退時(shí)間附近看下是否有異常推沸,發(fā)現(xiàn)有oom-killer


    image.png
  • Out of memory killer 在可用內(nèi)存極低的情況下會(huì)殺死某些進(jìn)程。只要達(dá)到觸發(fā)條件就會(huì)激活, 選中某個(gè)進(jìn)程并殺掉。 通常采用啟發(fā)式算法, 對(duì)所有進(jìn)程計(jì)算評(píng)分(heuristics scoring), 得分最低的進(jìn)程將被 kill 掉鬓催。它既不由JVM觸發(fā),也不由JVM代理, 而是系統(tǒng)內(nèi)核內(nèi)置的一種安全保護(hù)措施肺素。

  • 然后結(jié)合第二步,發(fā)現(xiàn)有一些操作會(huì)讓內(nèi)存暴漲(緩存了較多數(shù)據(jù)來(lái)追求性能優(yōu)化)深浮,雖然可以被GC压怠,但是導(dǎo)致服務(wù)器內(nèi)存過(guò)低。解決方式就是內(nèi)存擴(kuò)容一下飞苇,或者優(yōu)化應(yīng)用使用的內(nèi)存。

4 查問(wèn)題過(guò)程中蜗顽,其他輔助分析的工具

  • 先從free命令理解下linux內(nèi)存布卡。free -h
image.png
  • total總內(nèi)存=used已使用+free空閑。
  • buffers:用來(lái)存儲(chǔ)目錄里面有什么內(nèi)容雇盖。 比如執(zhí)行了ls /etc之后 buffers增長(zhǎng)了146980忿等。
  • cached:用來(lái)記憶我們打開(kāi)的文件。 比如新建一個(gè)文件 cached增長(zhǎng)了258804崔挖。
  • swap:應(yīng)用所需內(nèi)存超過(guò)物理內(nèi)存時(shí)贸街,就會(huì)發(fā)生頁(yè)面切換,通常要為系統(tǒng)配置swap空間狸相。 他在一個(gè)獨(dú)立磁盤(pán)分區(qū)上薛匪,物理內(nèi)存耗盡后,會(huì)將應(yīng)用最少運(yùn)行的部分置換到swap空間里(活躍的不置換)脓鹃,如果要訪問(wèn)swap空間的部分逸尖,就必須將他置換進(jìn)內(nèi)存,對(duì)應(yīng)用造成響應(yīng)和吞吐量影響瘸右。 JVM垃圾回收在頁(yè)面交換時(shí)性能很差娇跟,為了回收不可達(dá)對(duì)象所占用空間,需要訪問(wèn)大量?jī)?nèi)存太颤,如果堆的一部分被置換出去了苞俘,就必須先置換進(jìn)內(nèi)存以便垃圾回收器掃描存活對(duì)象,增加垃圾收集的持續(xù)的時(shí)間龄章,并且又stop the world吃谣,引起長(zhǎng)時(shí)間停頓。
  • -buffers/cache 的意思: 等于used-buffers-cached瓦堵。 從OS系統(tǒng)的角度來(lái)看,buffers/cached 都是屬于系統(tǒng)使用的基协,應(yīng)用使用的要減掉他們,反應(yīng)的是被程序?qū)崒?shí)在在吃掉的內(nèi)存菇用。
  • +buffers/cache 的意思: 等于free + buffers + cached 從應(yīng)用的角度來(lái)看澜驮,buffer/cached只是系統(tǒng)為了提高文件讀取的性能而設(shè)置的,當(dāng)自己應(yīng)用需要用到這塊的空間時(shí)惋鸥,系統(tǒng)可以把它們回收掉杂穷,給應(yīng)用程序使用悍缠,所以他們是應(yīng)用可以使用的內(nèi)存總數(shù)。
  • shared: 據(jù)說(shuō)是進(jìn)程間共享內(nèi)存耐量,了解不多飞蚓,因?yàn)檫@個(gè)參數(shù)出現(xiàn)的問(wèn)題沒(méi)有過(guò)。
  • 下面用工具vmstat查問(wèn)題廊蜒,通常從下面兩個(gè)方面看


    image.png
  • 內(nèi)存不夠用
  • swpd:使用的虛擬內(nèi)存大小趴拧。
  • free:空閑的物理內(nèi)存大小。
  • buff:用作緩沖的內(nèi)存大小山叮。
  • cache:用作緩存的內(nèi)存大小著榴。
  • si:每秒從交換區(qū)寫(xiě)到內(nèi)存的大小,由磁盤(pán)調(diào)入內(nèi)存屁倔。
  • so:每秒寫(xiě)入交換區(qū)的內(nèi)存大小脑又,由內(nèi)存調(diào)入磁盤(pán)。

如果swpd锐借,so,si比較高问麸,說(shuō)明內(nèi)存資源不足,已經(jīng)占用交換區(qū)資源钞翔。需要增加內(nèi)存严卖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗅战,隨后出現(xiàn)的幾起案子妄田,更是在濱河造成了極大的恐慌,老刑警劉巖驮捍,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟呐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡东且,警方通過(guò)查閱死者的電腦和手機(jī)启具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珊泳,“玉大人鲁冯,你說(shuō)我怎么就攤上這事∩椋” “怎么了薯演?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秧了。 經(jīng)常有香客問(wèn)我跨扮,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任衡创,我火速辦了婚禮帝嗡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璃氢。我一直安慰自己哟玷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布一也。 她就那樣靜靜地躺著巢寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘秦。 梳的紋絲不亂的頭發(fā)上讼渊,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音尊剔,去河邊找鬼。 笑死菱皆,一個(gè)胖子當(dāng)著我的面吹牛须误,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仇轻,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼京痢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了篷店?” 一聲冷哼從身側(cè)響起祭椰,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疲陕,沒(méi)想到半個(gè)月后方淤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹄殃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年携茂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诅岩。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讳苦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吩谦,到底是詐尸還是另有隱情鸳谜,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布式廷,位于F島的核電站咐扭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜草描,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一览绿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穗慕,春花似錦饿敲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至术浪,卻和暖如春瓢对,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胰苏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工硕蛹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硕并。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓法焰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倔毙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埃仪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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