JVM 問題排查

CPU使用率高

  • 找出使用率高的進程的pid
top
  • 找出使用率高的線程tpid
top -p pid -H
  • 查看使用率高的線程當(dāng)前在干什么
jstack -l pid > stack.log
// 將線程的tpid轉(zhuǎn)為16進制绝骚,到stack.log中查找
grep tpid stack.log -a3

GC問題

// -t:打印時間戳恩静,1s每隔1秒打印一次
jstat -gcutil -t pid 1s

也可以通過查看gc日志來觀察問題

內(nèi)存泄漏

  1. 執(zhí)行FullGC后不能回收的內(nèi)存不斷增加
  2. 執(zhí)行jstat -gcutil pid,查看Old區(qū)的使用情況阵漏,如果接近100%罢低,則代表內(nèi)存不足》急可以先增大內(nèi)存枪芒,如果還是不斷增長到溢出,則考慮是否有內(nèi)存泄漏問題
  3. 執(zhí)行jmap -histo:live pid > memory.log挺庞,統(tǒng)計所有存活對象的個數(shù)晰赞,觀察那些數(shù)量最多的對象,特別是自己寫的對象和存放到集合里沒有釋放的對象
  4. 如果還是無法定位选侨,則執(zhí)行jmap -dump導(dǎo)出整個Heap掖鱼,然后使用工具進行分析,注意看自己寫的類的依賴關(guān)系援制,看看是不是使用完沒有釋放锨用,或者一次性查詢過多的數(shù)據(jù)導(dǎo)致內(nèi)存溢出

線程分析

如果CPU使用率不高,但程序性能低下隘谣,則可考慮對線程進行分析增拥,看看各個主要的線程都在做什么啄巧,是否有鎖爭用或IO阻塞問題

為了方便分析,最好給每個線程或者線程池命名

jstack -l pid > stack.log

線程狀態(tài)

狀態(tài) 描述
New 線程剛被創(chuàng)建掌栅,還沒有被執(zhí)行
Runnable 線程正在執(zhí)行
Blocked 等待其他線程釋放鎖
Waiting 調(diào)用了wait或join方法秩仆,無限等待
Timed_Waiting 調(diào)用了sleep、wait(interval)猾封、join(interval)方法澄耍,有限等待

觀察

死鎖

如果JVM發(fā)現(xiàn)有死鎖存在,會在日志中出現(xiàn)Found one Java-level deadlock

Waiting on condition

在等待一個條件的發(fā)生晌缘,來把自己喚醒齐莲,或者調(diào)用了sleep方法
此時線程狀態(tài):
WAITING(parking):一直等待那個條件發(fā)生
TIMED_WAITING(parking或sleeping):定時等待,即使條件不發(fā)生磷箕,時間到了也可以自己喚醒

如果發(fā)現(xiàn)大量線程處于此狀態(tài)选酗,并且從線程的堆棧上查看到是正在執(zhí)行網(wǎng)絡(luò)讀寫,這可能是一個網(wǎng)絡(luò)瓶頸問題或者第三方響應(yīng)慢的問題

Blocked

線程所需要的資源長時間等待卻一直無法獲取岳枷,被標(biāo)識為阻塞狀態(tài)芒填,可以理解為等待資源超時的線程。線程堆棧中一般存在Waiting to Lock

Waiting for monitor entry 和 in Object.wait()

每個 Monitor在某個時刻空繁,只能被一個線程擁有殿衰,該線程就是Active Thread,而其它線程都是Waiting Thread盛泡,分別在兩個隊列 Entry Set和Wait Set里面等候闷祥。 在Entry Set中等待的線程狀態(tài)是Waiting for monitor entry,而在Wait Set中等待的線程狀態(tài)是in Object.wait()傲诵。當(dāng)被調(diào)用notify或notifyAll時凯砍,只有在Wait Set中的線程會被喚醒

Waiting for monitor entry:等待進入一個臨界區(qū) ,所以它在Entry Set隊列中等待掰吕。此時線程狀態(tài)一般都是Blocked,如果存在大量線程在此狀態(tài)颅痊,可能是一個全局鎖阻塞住了大量線程殖熟。隨著時間流逝,waiting for monitor entry的線程越來越多斑响,沒有減少的趨勢菱属,可能意味著某些線程在臨界區(qū)里呆的時間太長了,以至于越來越多新線程遲遲無法進入臨界區(qū)

當(dāng)線程獲得了Monitor舰罚,如果發(fā)現(xiàn)線程繼續(xù)運行的條件沒有滿足纽门,它則調(diào)用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了Monitor营罢,進入Wait Set隊列赏陵。此時線程狀態(tài)大致為以下幾種:TIMED_WAITING (on object monitor)和 WAITING (on object monitor)

等待IO

有時候線程狀態(tài)是Runnable饼齿,但卻是在等待IO

"socketReadThread" prio=6 tid=0x0000000006a0d800 nid=0x1b40 runnable
[0x00000000089ef000] java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method) 

總結(jié)

  1. 如果cpu使用率不高,但性能低下蝙搔,一般都是由鎖或IO阻塞造成缕溉,這時要注意查看狀態(tài)為BLOCKED或者Waiting的線程,看它們需要等待什么鎖或者是否出現(xiàn)了死鎖吃型,再考慮如何優(yōu)化并發(fā)
  2. 如果發(fā)現(xiàn)有大量的線程都在處在 Wait on condition证鸥,從線程 stack看,正等待網(wǎng)絡(luò)讀寫勤晚,這可能是一個網(wǎng)絡(luò)瓶頸的征兆枉层。因為網(wǎng)絡(luò)阻塞導(dǎo)致線程無法執(zhí)行。一種情況是網(wǎng)絡(luò)非常忙赐写,幾乎消耗了所有的帶寬鸟蜡,仍然有大量數(shù)據(jù)等待網(wǎng)絡(luò)讀寫;另一種情況也可能是網(wǎng)絡(luò)空閑血淌,但由于路由等問題矩欠,導(dǎo)致包無法正常的到達

參考

性能分析之– JAVA Thread Dump 分析綜述
三個實例演示 Java Thread Dump 日志分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悠夯,隨后出現(xiàn)的幾起案子癌淮,更是在濱河造成了極大的恐慌,老刑警劉巖沦补,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乳蓄,死亡現(xiàn)場離奇詭異,居然都是意外死亡夕膀,警方通過查閱死者的電腦和手機虚倒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來产舞,“玉大人魂奥,你說我怎么就攤上這事∫酌ǎ” “怎么了耻煤?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長准颓。 經(jīng)常有香客問我哈蝇,道長,這世上最難降的妖魔是什么攘已? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任炮赦,我火速辦了婚禮,結(jié)果婚禮上样勃,老公的妹妹穿的比我還像新娘吠勘。我一直安慰自己性芬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布看幼。 她就那樣靜靜地躺著批旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诵姜。 梳的紋絲不亂的頭發(fā)上汽煮,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音棚唆,去河邊找鬼暇赤。 笑死,一個胖子當(dāng)著我的面吹牛宵凌,可吹牛的內(nèi)容都是我干的鞋囊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞎惫,長吁一口氣:“原來是場噩夢啊……” “哼溜腐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓜喇,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挺益,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乘寒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體望众,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年伞辛,在試婚紗的時候發(fā)現(xiàn)自己被綠了烂翰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚤氏,死狀恐怖甘耿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竿滨,我是刑警寧澤佳恬,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站姐呐,受9級特大地震影響殿怜,放射性物質(zhì)發(fā)生泄漏典蝌。R本人自食惡果不足惜曙砂,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骏掀。 院中可真熱鬧鸠澈,春花似錦柱告、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涵妥,卻和暖如春乖菱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬网。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工窒所, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆锋。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓吵取,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锯厢。 傳聞我的和親對象是個殘疾皇子皮官,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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