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占用一直很高