應(yīng)用出現(xiàn)問題怎么辦之javacore

1 什么是javacore

javacore是JVM內(nèi)所有線程信息的日志輸出,通常又叫做thread dump,可以了解當(dāng)前系統(tǒng)在做什么,對于問題分析還是會很有幫助;這個信息中包含線程的調(diào)用棧及線程的運行狀態(tài)。執(zhí)行thread dump獲取javacore日志不會停止應(yīng)用。

2 如何獲取javacore

在新版本的JDK提供了jstack工具后,建議都使用該工具來獲取javacore.使用jstack獲取javacore的步驟如下:

使用jps得到j(luò)ava相關(guān)進程的pid,執(zhí)行jps -v

得pid后,執(zhí)行jstack -l??> javacore..log. 如:jstack -l 1772 > javacore.1772.log

Tips:?為了有一個比較,通常,會在間隔一定的時間后(如5s、10s,30s)多次取javacore。注意,此時應(yīng)該使用 >> 以追加的方式重定向輸出

-

另外,在Linux系統(tǒng)下,通過kill -3 也是獲取javacore的方法。不過,該方法的日志輸出不是很好確定。所以,如果可以的話,盡量使用jstack工具獲取。

2.1 產(chǎn)生多個JavaCore的工具

輸出多個Java Core的腳本

pids=`pgrep -f /home/MLF/TRS/jdk1.7.0_71/`

echo $pids

for (( c=1;c<=50;c++ ))

do

echo "操作系統(tǒng)密碼" |sudo -S /home/MLF/TRS/jdk1.7.0_71/bin/jstack -l $pids > /home/MLF/TRS/TRSWCMV7/wcmlogs/javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt

# echo $c

#echo javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt

sleep 1

done


出現(xiàn)CPU占用很高或者發(fā)布時間執(zhí)行很長時,一般都要用到JavaCore文件;

主要是基于不能在黑箱下分析問題,必須知道Tomcat當(dāng)時在做什么;

JavaCore就可以反映出瞬時Java線程在作什么;

瞬間做什么不能說明問題,如果每次的JavaCore同一個線程都停留在同一行代碼中,那么說明有問題

一般用jstack獲取JavaCore

每隔1秒,輸出一個JavaCore,總共輸出50個JavaCore文件的Shell:

pids=`pgrep?-f?/home/MLF/TRS/jdk1.7.0_71/`

echo?$pids

for (( c=1;c<=50;c++ ))

do

??echo?"操作系統(tǒng)密碼"?|sudo?-S?/home/MLF/TRS/jdk1.7.0_71/bin/jstack?-l?$pids?> /home/MLF/TRS/TRSWCMV7/wcmlogs/javacore_$(date?-d?"yesterday"?+"%Y%m%d%H%M%S")_$c.txt

??# echo $c

??#echo javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt

????????sleep?1

done


2.2 WCM在線產(chǎn)生Core的工具:

wcm/wcm_use/threaddump.jsp?count=2&interval=10

相關(guān)JSP:threaddump.jsp

3 如何分析javacore

javacore分析,很多時候是關(guān)心線程的數(shù)量及其狀態(tài),然后再對若干個別的線程棧進行分析。在javacore中,線程的狀態(tài)可能是以下幾種

狀態(tài)意義

NEW未開始

RUNNABLE正在執(zhí)行,可以簡單理解為在Thread.run方法中

BLOCKED被阻塞。在等待必要的資源以進入執(zhí)行狀態(tài)。

WAITING等待

TIMED_WAITING休眠等待??梢院唵卫斫鉃門hread.sleep

TERMINATED結(jié)束退出

一般來說,NEW/TERMINATED兩個狀態(tài)是較少見到的,而RUNNABLE、BLOCKED兩個狀態(tài)的線程是需要我們著重關(guān)注的。通常出現(xiàn)BLOCKED狀態(tài)就是應(yīng)用出現(xiàn)等待或掛起的地方。

借助一些工具來分析這個日志可以顯著提高效率。

可以看一下內(nèi)網(wǎng)實例分析thread dump熱一下身先。然后,來認(rèn)識一下jca工具。

4 JCA工具分析thread dump

JCA即Java Core Analyzer,是IBM出品的thread dump分析工具。其詳細(xì)的使用介紹,見這里。

本節(jié)介紹一下compare thread的使用,以分析阻塞的線程。前面完成日志的獲取后,運行打開工具,選擇生成的日志文件即可。

打開日志后如圖所示,是一個thread dump的列表,每一次的jstack輸出就是一行。

為了使用compare threads,選中列表中的多行。按住Crtl鍵,點選其中的行即可。選擇后,右鍵點擊compare threads


在出來的結(jié)果中,關(guān)注其中顏色為綠邊,紅底的內(nèi)容。綠邊表示進程處理RUNNABLE狀態(tài)(運行),紅底標(biāo)注表示多個thread dump中同一個進程的棧是沒有變化的(在做同一件事)。


前面已經(jīng)提到,我們在獲取日志是以一定間隔進行的。如果在一個足夠長的時間內(nèi),同一個進程的棧沒有變化,就可以相信這個進程掛住,長時間沒有完成,可能存在問題。然后通過相應(yīng)的棧信息檢查自己寫的代碼。(點擊其中一個就可以在右邊看到詳細(xì)的棧信息)


5 什么時候應(yīng)該獲取javacore并分析

一句話:但凡應(yīng)用出現(xiàn)等待都應(yīng)該考慮獲取javacore來分析應(yīng)用到底是在哪里出現(xiàn)了等待或長時間沒完成的任務(wù)而持有了相應(yīng)的資源。如以下的一些情況:

用戶無法登錄。輸入用戶名/密碼點擊登錄后,長時間不能完成登錄。

文檔發(fā)布慢,發(fā)布監(jiān)控中待發(fā)隊列內(nèi)容較多,完成的發(fā)布隊列時間比較長。(這個可能還會涉及到數(shù)據(jù)庫/模板等的一些調(diào)優(yōu))

無法完成文檔保存。點擊保存后,一直讀秒無法完成文檔保存。

應(yīng)用CPU占用一直很高

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容