JVM學習總結五——性能監控及故障處理工具

    以前扯了四篇理論,這一篇終於能夠動動手了。本篇咱們將介紹JVM經常使用的一些工具,這些工具將是咱們監控JVM狀態、處理故障和調優分析的利器。 不過在開始以前,我仍是要先車扯兩句:工具終歸只是幫助咱們咱們處理問題的,想要快速準確的解決問題,最爲關鍵的仍是對內在理論的理解和豐富的實踐經驗,因此若是對JVM的內存處理機制不瞭解,仍是要用心學習一下。好了, 子曰:「工欲善其事,必先利其器。「,下邊開始介紹。 java

1、JDK命令行工具

    全部的java開發人員都知道JDK的bin目錄下存放着編譯java須要的javac,以及運行java程序須要的java這兩個命令工具,可是不少人並無注意到,其實除了這兩個工具,該目錄下還有不少工具,這些工具其實爲咱們提供了不少方便且強大的功能,如下是部分截圖(各工具做用見:jdk/jre bin下工具介紹): linux

    

    本篇咱們只關注監控和故障處理相關的工具,見下表:
c++

名稱     做用
jps JVM Process Status Tool,現實指定系統內全部的HotSpot虛擬機進程 
jstats
JVM Statistics Monitoring Tool,用於收集Hotspot虛擬機各個方面的運行參數 
jinfo
Configuration Info for Java,現實虛擬機配置信息
jmap
Memory map for java,生成虛擬機的內存轉儲快照
jhat
JVM heap Dunp Browser,用於分析heapdump文件,他會創建一個HTTP/HTML服務,讓用戶可經過瀏覽器查看 
jstack
Stack Track for java ,顯示虛擬機線程快照

    下邊咱們來看一下每一個的簡單用法:
git

一、jps

    其實應該說這個命令多數人仍是比較熟悉的,通常咱們想要防止程序啓動兩次,或者判斷某java進程是否存活,都會採用該命令獲取系統當前運行的全部java進程,而後根據進程名判斷。固然也能夠以此得到對應進程的id(此id指JVM裏的LVMID,可是他和系統進程ID是一致的),而後kill他來結束程序。其用法以下:
github

語法結構:
jsp [options] [hostid]

參數:
-q 只輸出ID
-l 顯示虛擬機執行的主類
-m 顯示傳給main的參數
-v 輸出啓動的JVM參數

二、jstat

    jstat用於監控虛擬機各類運行狀態信息,能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI的狀況下他是性能分析的首選工具。
web

語法結構:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 

參數:
Options — 選項,咱們通常使用 -gcutil 查看gc狀況  
vmid    — VM的進程號,即當前運行的java進程號  
interval– 間隔時間,單位爲秒或者毫秒  
count   — 打印次數,若是缺省則打印無數次 S0  — Heap上的 Survivor space 0 區已使用空間的百分比  

列說明:
S1  — Heap上的 Survivor space 1 區已使用空間的百分比  
E   — Heap上的 Eden space 區已使用空間的百分比  
O   — Heap上的 Old space 區已使用空間的百分比  
P   — Perm space 區已使用空間的百分比  
YGC — 從應用程序啓動到採樣時發生 Young GC 的次數  
YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)  
FGC — 從應用程序啓動到採樣時發生 Full GC 的次數  
FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)  
GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)

三、jinfo

    這個命令能夠實時查看調整JVM的運行參數,須要注意的是該工具僅在linux下比較有用,win下雖有提供,可是限制很大 ,使用方法以下: 算法

語法結構:
jinfo [options] pid

參數:
-v 查看虛擬機顯式參數
-flag[+/-] 查看全部參數,+/-能夠添加/減小運行時參數
-sysprops 打印System.getProperties()的內容

四、jmap

    jmap用於生成堆轉儲快照(heapdump,用於JVM內存狀態分析,是故障處理或調優的關鍵參考數據),還能夠查詢finalize隊列,java堆和永久代詳細信息。此外,該工具一樣在win下是個殘廢。 shell

語法結構:
jmap [ option ] pid

參數:
-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件. 
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況.
-histo[:live] 打印每一個class的實例數目,內存佔用,類全名信息. VM的內部類名字開頭會加上前綴」*」. 若是live子參數加上後,只統計活的對象數量. 
-permstat 打印classload和jvm heap長久層的信息. 包含每一個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和佔用內存數也會打印出來. 
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效. 
-h | -help 打印輔助信息 
-J 傳遞參數給jmap啓動的jvm.

五、jhat

    一般與jmap搭配使用,用來分析jmap生成的heapdump文件,其內置了一個簡單的HTTP服務器(哈哈,最近本身也在寫一個web服務器,發現其實大致原理挺簡單的,麻煩的在於對web應用接口、內部處理細節的設計,以及併發處理,目前已經實現一個簡版,有興趣的見:easy-httpserver ),能夠在瀏覽器中查看分析結果。實際上該工具用處不大,一方面其功能簡單,比起經常使用的VisualVM等工具備必定差距,另外一方面在生產環境中去進行比較耗資源的分析處理,估計對很多公司都是犯忌諱的事吧,通常都是把heapdump導到本地處理。
    這裏就不介紹用法了,可自行谷歌裏百度。 瀏覽器

六、jstack

    看名字就知道是和棧相關的,而棧裏邊存的則是各個線程的私有數據(局部變量表、方法出口、操做數棧、對象引用等),所以該命令就是用來生成當前虛擬機的線程快照的(threaddump,可用來分析虛擬機某線程長時間挺對的緣由,如死鎖、死循環、資源請求時間過長等)。   服務器

語法結構:
jstack [ option ] pid

參數:
-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的全部棧信息.
-h | -help打印幫助信息

2、JDK可視化工具

    這一部分主要有兩個工具:JConsole和VisualVM,這兩個都提供了很強大的功能,此次先不介紹了,等下篇結合小例子分析吧。

    彷佛有點坑啊,困了,先睡了,最近心煩,等調整好繼續^_^。 

相關文章
相關標籤/搜索