1. 程式人生 > >JDK下虛擬機器效能監控以及故障分析工具

JDK下虛擬機器效能監控以及故障分析工具

  無論對於開發人員還是運維人員,給一個系統定位問題時,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段。對於開發人員或運維人員,這裡的資料包括:執行日誌、異常日誌、GC日誌、堆轉儲快照等。適當的使用這些工具,會使我們能夠快速定位問題,提升解決問題的速度。   針對JAVA程式設計師來說,我們這裡所講的瞭解使用JDK命令列工具監控虛擬機器的效能,定位系統問題。   JDK命令列工具,則是指JAVA_HOME\bin下的*.exe檔案。除了常用的javac和java命令,還有很多我們曾未了解以及使用的命令,JDK更新版本時,bin目錄下命令列工具的數量和功能則在不知不覺中增多和增強。JDK1.6中bin內容:【並非全部,太多不完全截圖了】  
  我們再看看JDK1.7中的bin內容【並非全部,太多不完全截圖了】      大家有沒有發現,這些exe工具的大小,一般很小,差不多十幾K,其實,這些JDK\bin下的工具真正的實現是在JDK\lib\tool.jar中。開啟tool.jar,其中sun\tools目錄:【JDK1.7.0_65】      注:版本不同,也許裡面的內容也不同,大部分的工具在JDK1.5已經提供,在此,通過JDK1.6,以及JDK1.7給大家展示JDK命令列工具。   宣告:以下工具都是在Win7、JDK1.7.0_65(32位)基礎上操作的。

     JDK\bin下分為很多工具,具體的彙總分類:   http://docs.oracle.com/javase/7/docs/technotes/tools/
  在此只介紹重要的虛擬機器監控以及故障處理工具。   Monitoring Tools:
  •   jps:虛擬機器程序狀況工具
  解釋:列出正在執行的虛擬機器程序,並且可以顯示虛擬機器執行的朱磊名稱以及虛擬機器的唯一ID(LVMID,Local Virtual Machine Identififer)   時機:當監控某一個虛擬機器時,比如使用jconsole,jvisualvm(下文會介紹),需要知道虛擬機器ID。   
    其中引數意義:   -q:只輸出LVMID,省略主類的名稱   -m:輸出虛擬機器程序啟動時傳遞給主類main()函式的引數   -l:輸出主類的全名,如果程序執行的是jar包,輸出jar路徑   -v:輸出虛擬機器程序啟動時JVM引數   啟動tomca7,tomcat6,虛擬機器程序如下:
  這樣就可以看出,兩個jvm程序,到底具體位置了,以及其中的啟動引數,根據引數可知,7800程序初始化堆大小8m,7608程序是新安裝的tomcat7,為了測試並沒有設定初始化引數,所以通過jps看不出其初始化引數。7108程序tomcat6的,初始化堆和最大堆大小都是1G。
  • jstat:虛擬機器統計資訊監視工具
  解釋:jvm statistics monitoring tool,用於監視虛擬機器各種執行狀態,可以顯示本地或遠端虛擬機器程序中的記憶體資訊、垃圾收集資訊、類裝載資訊、JTT編譯資料。唯一不足之處,在於他沒有介面,只是純文字形式。   時機:通過jpl獲取需要監控的虛擬機器ID,然後通過jstat來檢視虛擬機器執行狀態,及時定位以及解決問題。   用途:jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]   引數講解:jstat的option分為兩部分,generalOption一般選項和outputOption輸出選項,一般選項則是-help or -option;而outputOptions則包括統計資訊;vmid:虛擬機器I的,interval:間隔、count:查詢次數。   若是遠端jvm,則VMID的格式則:[protocol:][//]lvmid[@hostname[:port]/servername]   對於outputOption 部分引數如下:

  上圖中的S、E等字母,在此簡單介紹一下,後面講GC演算法會具體介紹,其中S0、S1是指幸運區0、1;E是指伊甸區,這三區則稱為新生代;O代表老年區。P代表持久區;YGC新生代GC次數,YGCT新生代時間。FGC:老年代GC次數,老年代GC時間。GCT總共的GC時間。   jstat官網: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
Troubleshooting Tools
  • jinfo:Java配置資訊工具
解釋:Configuration Info for Java,實時檢視和調整虛擬機器的各項引數。
  若你是64位vm,則需要指定 -J-d64引數【這個沒測,本機是32位】   宣告:沒有截完整,其中jps-v沒有顯示出的引數,通過jinfo可以檢視完整資訊。
  jinfo官網: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jinfo.html
  • jmap:Java記憶體映像工具
  解釋:Memory Map for Java 用於生成堆轉儲快照(heapdump或dump檔案),若不通過jmap,還可以通過暴力手段-XX:+HeapDumpOnOutOfMemoryError引數,後面專門有部落格來講解dump檔案。   時機:除了生成dump檔案,還可以查詢記憶體詳細資訊,如空間使用率、當前使用那種收集器等。   格式:jmap [option] vmid   option如下:
  jmap官網: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
  • jhat:虛擬機器堆轉儲快照分析工具
  解釋:JVM Heap Analysis Tool,與jmap相輔相成,jmap生成dump檔案,jhat分析dum檔案。jhat具體分析結果,下篇部落格與jmap並講。   jhat官網: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jhat.html
  • jstack:Java 堆疊跟蹤工具
  解釋:Stack Trace for Java,生成虛擬機器當前時刻的執行緒快照threaddump或javacore檔案。   目的:定位執行緒長時間停頓原因。
C:\Users\..>jstack Usage:     jstack [-l] <pid>         (to connect to running process)     jstack -F [-m] [-l] <pid>         (to connect to a hung process)     jstack [-m] [-l] <executable> <core>         (to connect to a core file)     jstack [-m] [-l] [[email protected]]<remote server IP or hostname>         (to connect to a remote debug server) Options:     -F  to force a thread dump. Use when jstack <pid> does not respond     -m  to print both java and native frames (mixed mode)     -l  long listing. Prints additional information about locks     -h or -help to print this help message jstack官網: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstack.html
  上文只是常用的以及其重要用途,若想對每個瞭解更深,可以去官網針仔細看,上文已經給出每個命令的連線,方便大家進一步深造。   上文提到的jmap以及jhat,還有未曾提到視覺化分析工具jconsole、jvisualvm,我們下篇會根據示例講解。