011 - JDK自帶的性能監控工具

 
1、概要:
jps -l
查看現有的java進程
jps -l 顯示全部正在運行的java進程id
 
jstack
查看Java線程
     jstack -l pid; 作thread dump,直接打印在串口
    jstack pid>> ./threaddumps  輸出到指定文件分析
 
jmap
查看Java內存使用狀況    
    jmap -histo:live pid 對象佔用內存排名
    jmap -dump:file=memroydumps pid 把heap dump到文件
 
jhat
經過查看jmap dump文件分析
    jhat ./threaddumps 分析dump文件
http://localhost:7000 查看分析結果
 
jstat
查看heap內各個部分的使用量,以及加載類的數量以及GC的相關信息。
jstat -options (查看參數) / jstat -help
 
jdk自帶的hprof
啓動應用時帶上hprof參數,查看cpu,內存使用狀況
java -agentlib:hprof=cpu=times,interval=20,depth=10 -jar start.jar
 
Jconsole&Jvisualvm
 
2、詳細介紹
1、命令行工具
JDK主要命令行監控工具和用途 

 

 
1.jps(虛擬機進程情況工具)
命令格式:jps命令格式:jps [ options ] [ hostid ]
    雖然功能比較單一,但它是使用頻率最高的JDK命令行工具,由於其餘的JDK工具大多須要輸入它查詢到的LVMID來肯定要監控的是哪個虛擬機進程。對於本地虛擬機進程來講,LVMID與操做系統的進程ID(Process Identifier,PID)是一致的。
    jps能夠經過RMI協議查詢開啓了RMI服務的遠程虛擬機進程狀態,hostid爲RMI註冊表中註冊的主機名。
 
jps的經常使用選項 

 

 
2.jstat(虛擬機統計信息監視工具)
命令格式:jstat [ option vmid [interval[s|ms] [count]] ]
    對於命令格式中的VMID與LVMID須要特別說明一下:若是是本地虛擬機進程,VMID與LVMID是一致的,若是是遠程虛擬機進程,那VMID的格式應當是:[protocol:][//]lvmid[@hostname[:port]/servername]
    參數interval和count表明查詢間隔和次數,若是省略這兩個參數,說明只查詢一次。假設須要每250毫秒查詢一次進程2764垃圾收集情況,一共查詢20次,那命令應當是:jstat -gc 2764 250 20
    jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各類運行狀態信息的命令行工具。它能夠顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形界面,只提供了純文本控制檯環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。
 
選項option表明着用戶但願查詢的虛擬機信息,主要分爲3類:類裝載、垃圾收集、運行期編譯情況: 

 

舉例:
D:\Develop\Java\jdk1.6.0_21\bin>jstat -gcutil 2764
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 6.20 41.42 47.20 16 0.105 3 0.472 0.577
    
    查詢結果代表:這臺服務器的新生代Eden區(E,表示Eden)使用了6.2%的空間,兩個Sur-vivor區(S0、S1,表示Survivor0、Survivor1)裏面都是空的,老年代(O,表示Old)和永久代(P,表示Permanent)則分別使用了41.42%和47.20%的空間。程序運行以來共發生MinorGC(YGC,表示Young GC)16次,總耗時0.105秒,發生Full GC(FGC,表示Full GC)3次,Full GC總耗時(FGCT,表示Full GC Time)爲0.472秒,全部GC總耗時(GCT,表示GC Time)爲0.577秒。 
 
3.jinfo(Java配置信息工具)
命令格式:jinfo [ option ] pid
    jinfo(Configuration Info for Java)的做用是實時地查看和調整虛擬機各項參數。使用jps命令的-v參數能夠查看虛擬機啓動時顯式指定的參數列表,但若是想知道未被顯式指定的參數的系統默認值,除了去找資料外,就只能使用jinfo的-flag選項進行查詢了(若是隻限於JDK 1.6或以上版本的話,使用java-XX:+PrintFlagsFinal查看參數默認值也是一個很好的選擇),jinfo還可使用-sysprops選項把虛擬機進程的System.getProper-ties()的內容打印出來。這個命令在JDK 1.5時期已經隨着Linux版的JDK發佈,當時只提供了信息查詢的功能,JDK 1.6以後,jinfo在Windows和Linux平臺都有提供,而且加入了運行期修改參數的能力,可使用-flag[+|-]name或者-flagname=value修改一部分運行期可寫的虛擬機參數值。JDK 1.6中,jinfo對於Windows平臺功能仍然有較大限制,只提供了最基本的-flag選項。
 
舉例:(打印系統屬性)
 C:\> jinfo -sysprops 73033
Attaching to process ID 73033, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b16 
 
4.jmap(Java內存映像工具)
命令格式:jmap [ option ] vmid
    jmap(Memory Map for Java)命令用於生成堆轉儲快照(通常稱爲heapdump或dump文件)。若是不使用jmap命令,要想獲取Java堆轉儲快照,還有一些比較「暴力」的手段:-XX:+HeapDumpOnOutOfMemory-Error參數,可讓虛擬機在OOM異常出現以後自動生成dump文件,經過-XX:+Heap-DumpOnCtrlBreak參數則可使用[Ctrl]+[Break]鍵讓虛擬機生成dump文件,又或者在Linux系統下經過Kill-3命令發送進程退出信號「嚇唬」一下虛擬機,也能拿到dump文件。
    jmap的做用並不只僅是爲了獲取dump文件,它還能夠查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前用的是哪一種收集器等。
    和jinfo命令同樣,jmap有很多功能在Win-dows平臺下都是受限的,除了生成dump文件的-dump選項和用於查看每一個類的實例、空間佔用統計的-histo選項在全部操做系統都提供以外,其他選項都只能在Linux/Solaris下使用。
 
option選項: 

 

舉例:(使用jmap生成一個正在運行的Eclipse的dump快照文件的例子,例子中的3500是經過jps命令查詢到的LVMID)
C:\Users\IcyFenix>jmap -dump:format=b,file=eclipse.bin 3500
Dumping heap to C:\Users\IcyFenix\eclipse.bin …
Heap dump file created 
 
5.jhat(虛擬機堆轉儲快照分析工具)
命令格式:jhat +dump文件名
    Sun JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,能夠在瀏覽器中查看。
    分析dump文件的工具還有:VisualVM,以及專業用於分析dump文件的Eclipse Memory Ana-lyzer、IBM HeapAnalyzer等工具,都能實現比jhat更強大更專業的分析功能。
 
使用:
 C:\Users\IcyFenix>jhat eclipse.bin
Reading from eclipse.bin…
Dump file created Fri Nov 19 22:07:21 CST 2010
Snapshot read, resolving…
Resolving 1225951 objects…
Chasing references, expect 245 dots….
Eliminating duplicate references…
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
 
屏幕顯示「Server is ready.」的提示後,用戶在瀏覽器中鍵入 http://localhost:7000/就能夠看到分析結果了
 
分析結果默認是以包爲單位進行分組顯示,分析內存泄漏問題主要會使用到其中的「Heap His-togram」(與jmap-histo功能同樣)與OQL頁籤的功能,前者能夠找到內存中總容量最大的對象,後者是標準的對象查詢語言,使用相似SQL的語法 
 
6.jstack(Java堆棧跟蹤工具)
命令格式:jstack [ option ] vmid
    jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(通常稱爲threaddump或者javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等都是致使線程長時間停頓的常見緣由。線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作些什麼事情,或者等待着什麼資源。
    在JDK 1.5中,java.lang.Thread類新增了一個getAllStackTraces()方法用於獲取虛擬機中全部線程的StackTraceElement對象。使用這個方法能夠經過簡單的幾行代碼就完成jstack的大部分功能,在實際項目中不妨調用這個方法作個管理員頁面,能夠隨時使用瀏覽器來查看線程堆棧
 
option選項: 

 

舉例:
C:\Users\IcyFenix>jstack -l 3500
2010-11-19 23:11:26
Full thread dump Java HotSpot(TM) 64-Bit Server
VM (17.1-b03 mixed mode):
"[ThreadPool Manager] - Idle Thread」 daemon
 prio=6 tid=0x0000000039dd4000 nid=0xf50 in 
Object.wait() [0x000000003c96f000]
java.lang.Thread.State: WAITING (on object monitor) 
 
2、JDK可視化工具
    JDK中除了提供大量的命令行工具外,還有兩個功能強大的可視化工具:JConsole和VisualVM,這兩個工具是JDK的正式成員,沒有被貼上「un-supported and experimental」的標籤。
    其中JConsole是在JDK 1.5時期就已經提供的虛擬機監控工具,而VisualVM在JDK 1.6 Up-date7中才首次發佈,如今已經成爲Sun(Oracle)主力推進的多合一故障處理工具,而且已經從JDK中分離出來成爲能夠獨立發展的開源項目。 
 
1.JConsole(Java監視與管理控制檯)
    JConsole(Java Monitoring and ManagementConsole)是一種基於JMX的可視化監視、管理工具。它管理部分的功能是針對JMX MBean進行管理,因爲MBean可使用代碼、中間件服務器的管理控制檯或者全部符合JMX規範的軟件進行訪問
 
啓動JConsole
    經過JDK/bin目錄下的「jconsole.exe」啓動JConsole後,將自動搜索出本機運行的全部虛擬機進程,不須要用戶本身再使用jps來查詢了
    雙擊選擇其中一個進程便可開始監控,也可使用下面的「遠程進程」功能來鏈接遠程服務器,對遠程虛擬機進行監控。
 
 
    主界面裏共包括「概述」、「內存」、「線程」、「類」、「VM摘要」、「MBean」6個頁籤;
1)「概述」頁籤顯示的是整個虛擬機主要運行數據的概覽,其中包括「堆內存使用狀況」、「線程」、「類」、「CPU使用狀況」4種信息的曲線圖,這些曲線圖是後面「內存」、「線程」、「類」頁籤的信息彙總
2)「內存」頁籤至關於可視化的jstat命令,用於監視受收集器管理的虛擬機內存(Java堆和永久代)的變化趨勢。
3) 「線程」頁籤的功能至關於可視化的jstack命令,遇到線程停頓時可使用這個頁籤進行監控分析
    線程長時間停頓的主要緣由主要有:等待外部資源(數據庫鏈接、網絡資源、設備資源等)、死循環、鎖等待(活鎖和死鎖) 
 
2.VisualVM(多合一故障處理工具)
    VisualVM(All-in-One Java TroubleshootingTool)是到目前爲止隨JDK發佈的功能最強大的運行監視和故障處理程序,而且能夠預見在將來一段時間內都是官方主力發展的虛擬機故障處理工具。
    官方在VisualVM的軟件說明中寫上了「All-in-One」的描述字樣,預示着它除了運行監視、故障處理外,還提供了不少其餘方面的功能。並且VisualVM的還有一個很大的優勢:不須要被監視的程序基於特殊Agent運行,所以它對應用程序的實際性能的影響很小,使得它能夠直接應用在生產環境中。這個優勢是JProfiler、YourKit等工具沒法與之媲美的。
 
 
VisualVM兼容範圍與插件安裝:
VisualVM基於NetBeans平臺開發,所以它一開始就具有了插件擴展功能的特性,經過插件擴展支持,VisualVM能夠作到:
   •顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo)。
   •監視應用程序的CPU、GC、堆、方法區以及線程的信息(jstat、jstack)。
   •dump以及分析堆轉儲快照(jmap、jhat)。
   •方法級的程序運行性能分析,找出被調用最多、運行時間最長的方法。
   •離線程序快照:收集程序的運行時配置、線程dump、內存dump等信息創建一個快照,能夠將快照發送開發者處進行Bug反饋。
   •其餘plugins的無限的可能性……
 
 
啓動VisualVM
    經過JDK/bin目錄下的「jvisualVM」啓動
首次啓動VisualVM後,先沒必要着急找應用程序進行監測,由於如今VisualVM尚未加載任何插件,雖然基本的監視、線程面板的功能主程序都以默認插件的形式提供了,可是不給VisualVM裝任何擴展插件,就至關於放棄了它最精華的功能,和沒有安裝任何應用軟件操做系統差很少。
 
插件安裝:
    插件能夠進行手工安裝,在相關網站上下載*.nbm包後,點擊「工具」→「插件」→「已下載」菜單,而後在彈出的對話框中指定nbm包路徑即可進行安裝,插件安裝後存放在JDK_HOME/lib/visualvm/visualvm中。不過手工安裝並不經常使用,使用VisualVM的自動安裝功能已經能夠找到大多數所需的插件,在有網絡鏈接的環境下,點擊「工具」→「插件菜單」,彈出插件頁籤,在頁籤的「可用插件」中列舉了當前版本VisualVM可使用的插件,選中插件後在右邊窗口將顯示這個插件的基本信息,如開發者、版本、功能描述
 
VisualVM中「概述」、「監視」、「線程」、「MBeans」的功能與JConsole差異不大
 
1)生成、瀏覽堆轉儲快照 

 

在VisualVM中生成dump文件有兩種方式,能夠執行下列任一操做:   
   •在「應用程序」窗口中右鍵單擊應用程序節點,而後選擇「堆Dump」。
   •在「應用程序」窗口中雙擊應用程序節點以打開應用程序標籤,而後在「監視」標籤中單擊「堆Dump」。
 
    生成了dump文件以後,應用程序頁籤將在該堆的應用程序下增長一個以[heapdump]開頭的子節點,而且在主頁籤中打開了該轉儲快照。若是須要把dump文件保存或發送出去,要在heapdump節點上右鍵選擇「另存爲」菜單,不然當VisualVM關閉時,生成的dump文件會被當作臨時文件刪除掉。要打開一個已經存在的dump文件,經過文件菜單中的「裝入」功能,選擇硬盤上的dump文件便可。
    從堆頁籤中的「摘要」面板能夠看到應用程序dump時的運行時參數、System.getProperties()的內容、線程堆棧等信息,「類」面板則是以類爲統計口徑統計類的實例數量、容量信息,「實例」面板不能直接使用,由於不能肯定用戶想查看哪一個類的實例,因此須要經過「類」面板進入,在「類」中選擇一個關心的類後雙擊鼠標,便可在「實例」裏面看見此類實例的具體屬性信息。「OQL控制檯」面板中就是運行OQL查詢語句的,同jhat中介紹的OQL功能同樣。
 
2)分析程序性能 

 

在Profiler頁籤中,VisualVM提供了程序運行期間方法級的CPU執行時間分析以及內存分析,作Profiling分析確定會對程序運行性能有比較大的影響,因此通常不在生產環境中使用這項功能。
    要開始分析,先選擇「CPU」和「內存」按鈕中的一個,而後切換到應用程序中對程序進行操做,VisualVM會記錄到這段時間中應用程序執行過的方法。若是是CPU分析,將會統計每一個方法的執行次數、執行耗時;若是是內存分析,則會統計每一個方法關聯的對象數以及這些對象所佔的空間。分析結束後,點擊「中止」按鈕結束監控過程
 
注意:在JDK 1.5以後,在Client模式下的虛擬機加入而且自動開啓了類共享——這是一個在多虛擬機進程中共享rt.jar中類數據以提升加載速度和節省內存的優化,而根據相關Bug報告的反映,VisualVM的Profiler功能可能會由於類共享而致使被監視的應用程序崩潰,因此讀者進行Profiling前,最好在被監視程序中使用-Xshare:off參數來關閉類共享優化。
 
3)BTrace 動態日誌跟蹤
    BTrace是一個很「有趣」的VisualVM插件,自己也是能夠獨立運行的程序。它的做用是在不中止目標程序運行的前提下,經過HotSpot虛擬機的HotSwap技術動態加入本來並不存在的調試代碼。
    這項功能對實際生產中的程序頗有意義:常常遇到程序出現問題,但排查錯誤的一些必要信息,譬如方法參數、返回值等,在開發時並無打印到日誌之中,以致於不得不停掉服務,經過調試增量來加入日誌代碼以解決問題。當遇到生產環境服務沒法隨便中止時,缺一兩句日誌致使排錯進行不下去是一件很是鬱悶的事情。
    

 

    在VisualVM中安裝了BTrace插件後,在應用程序面板中右鍵點擊要調試的程序,會出現「TraceApplication……」菜單,點擊將進入BTrace面板。這個面板裏面看起來就像一個簡單的Java程序開發環境,裏面還有一小段Java代碼,如圖。 
 
在VisualVM中安裝了BTrace插件後,在應用程序面板中右鍵點擊要調試的程序,會出現「TraceApplication……」菜單,點擊將進入BTrace面板。這個面板裏面看起來就像一個簡單的Java程序開發環境,裏面還有一小段Java代碼
相關文章
相關標籤/搜索