如何分析websphere中間件生成的javacore文件

when you find free memory < 50% when no heavy access, please run kill -3 <pid>
執行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid為was java進程的id號,可以用ps -ef|grep java 查到),可以多執行幾次,按照下面操作進行
ps -ef > psef1.txt
ps aux > psaux1.txt
vmstat 5 10 > vmstat.txt
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
netstat -an> netstat2.txt
ps -ef > psef2.txt
ps aux > psaux2.txt
將上面產生的 txt 文件和/usr/WebSphere/AppServer/javacore*文件和heapdump文件拷貝到本地,然後刪除這些文件,因為這些文件會佔用較大的文件系統空間

管理過中間件weblogic和webspere的朋友都知道,兩者中都有一個通病,都會發生內存溢出的情況發生,當然,內存溢出跟中間件本身沒有關係,主要是應用程序設計不合理或參數設置不當引起,javacore就是內存溢出生成的其中一個文件,但是javacore也可以通過手工kill -3 pid生成,用於診斷系統性能,提供優化分析數據。
javacore還有一個最大的用途是我們可以通過Javacore文件來進行線程轉儲,通過採集和分析Javacore,了解JVM的運行情況,可以使我們更清晰地了解系統的整體運行情況,幫助我們判斷系統是否運行正常,或是在繁忙時存在哪些隱患,但是javacore具體是什麼呢?
一:什麼是javacore
javacore是Java應用程序在某一時間的文本表示形式,也可理解為Java Dump(通常稱為Thread Dump)的線程轉儲文件。該文件記錄了整個JVM的運行情況,包含線程、垃圾回收、JVM運行參數、內存地址等信息。JVM的許多問題都可以用這個文件進行診斷,其中比較典型的包括線程阻塞、CPU使用率過高、JVM Crash、堆內存不足和類裝載等問題。Javacore文件通常以*.txt方式顯示,名稱格式主要是以Javacore為頭,加上日期號、產生的時間號、當時的線程編號,如: Javacore.20131129.003424.299228.txt
二:如何獲取javacore
1. 向操作系統發送一個中止的signal
AIX和Linux:kill -3 PID
Windows:CTRL+Break,DrAdmin in WAS環境
2.在Java的執行代碼中使用JavaDump()方法
com.ibm.jvm.Dump.JavaDump() 方法促使JVM dump
發布ProblemDiagnosticsLabToolkit應用包,通過可視化頁面直接生成相關文件。
3.系統在異常時自動拋出
一個嚴重的本地調用出錯(非Java的異常)
JVM堆的大小被使用完了
OutOfMemory 錯誤(最最常見的一種,也就是我們前天所說的內存溢出)
三:javacore描述了什麼內容
在Javacore文件的幫助下,我們就可以更好地分析系統運行情況,在系統出現死鎖,或者內部錯誤、中間件等問題時,我們都可以通過Javacore進一步深入分析。我們可以在Javacore文件里找到以下相關信息:
1.JVM的參數啟動參數、Jdk版本
2.JVM堆大小
3.JVM產生原因、產生時間(可手動獲取,可系統拋出)
4.全局垃圾回收次數、分配失敗次數、內存溢出時,最後一次詳細的垃圾回收記錄
5.JVM堆內存地址信息
6.JVM中,所有線程執行情況(包含應用程序內部執行線程,容器線程,垃圾回收線程,定時線程,線程
池線程,頁面請求轉發線程等多種線程信息)
7.已裝載入JVM中的類的信息
四:如何分析javacore?
通過Javacore提供的信息對JVM進行一個全面的分析,除了了解垃圾回收情況、JVM相關配置信息外,分析重點可放在線程執行情況上,分析哪些線程在等待,哪些在執行,以便快速縮小問題範圍。IBM Thread and Monitor Dump Analyzer for Java分析工具可以讓我們清晰的分析Javacore文件,在IBM Thread and Monitor Dump Analyzer for Java工具中,請求線程可分為以下幾種狀態:
1.死鎖,Deadlock(重點關注)
2.執行中,Runnable(重點關注)
3.等待資源,Waiting on condition(重點關注)
4.等待監控器檢查資源,Waiting on monitor
5.暫停,Suspended
6.對象等待中,Object.wait()
7.阻塞,Blocked(重點關注)
8.停止,Parked
Deadlock:死鎖線程:一般指多個線程調用間,進入相互資源佔用,導致一直等待無法釋放的情況。
Runnable:一般指該線程正在執行狀態中,該線程佔用了資源,正在處理某個請求,有可能正在傳遞SQL到數據
庫執行,有可能在對某個文件操作,有可能進行數據類型等轉換。
Waiting on condition:等待資源,如果堆棧信息明確是應用代碼,則證明該線程正在等待資源,一般是大
量讀取某資源,且該資源採用了資源鎖的情況下,線程進入等待狀態,等待資源的讀取。又或者,
正在等待其他線程的執行等。
Blocked:線程阻塞,是指當前線程執行過程中,所需要的資源長時間等待卻一直未能獲取到,被容器的線程管
理器標識為阻塞狀態,可以理解為等待資源超時的線程。這種情況在was的日誌中,一般可以看到
CPU饑渴,或者某線程已執行了XX秒的信息。
在了解了以上線程狀態的具體意思後,我們就可以結合這些信息更進一步分析線程問題
在內存溢出時,分析Javacore文件中的線程內容,可以採用自下而上的分析方法。首先查看有多少線程被設置了Blocked狀態,這些線程是在執行什麼請求,並且到了堆棧最後一步在等待什麼資源,將其分類記錄下來;查找到這些Blocked線程等待的執行線程編號,在Javacore中,繼續查找該線程,分析其堆棧與狀態與監控器的記錄的信息。一般這些線程會處於Waiting on condition狀態,因為這些線程也是因為資源遲遲未獲取到或者執行時間過長一直處於等待狀體,進一步導致隊列中其他需要訪問這些資源的線程都被設置為Blocked狀態。在找到線程後,我們就可以初步將問題縮小到哪些業務應用請求存在問題,是哪一個類與哪一行代碼,其等待的資源是什麼。結合這些信息詳細分析業務代碼,或者根據這些問題到IBM網站中,查找對應版本的中間件是否存在同樣的問題,如有,則可以考慮打補丁升級。
一個Javacore描述的是在一個時間片段中的JVM的運行情況,這些信息相對來說是有限的,為了更進一步分析與定位問題,我們可以採集連續多個時間片段的Javacore,我一般情況下會每隔30秒或10秒生成一個javacore,這樣更加清晰JVM在該時間段內的運行情況,或者出現阻塞問題的線程及其相關線程的的執行情況,從而準確定位問題。
學會了javacore文件分析,不僅可以幫助我們定位並處理日常問題,也為日後向調優方向打了良好基礎。

以下文章點擊率最高

Loading…

發表評論