以前扯了四篇理論,這一篇終於能夠動動手了。本篇咱們將介紹JVM經常使用的一些工具,這些工具將是咱們監控JVM狀態、處理故障和調優分析的利器。 不過在開始以前,我仍是要先車扯兩句:工具終歸只是幫助咱們咱們處理問題的,想要快速準確的解決問題,最爲關鍵的仍是對內在理論的理解和豐富的實踐經驗,因此若是對JVM的內存處理機制不瞭解,仍是要用心學習一下。好了, 子曰:「工欲善其事,必先利其器。「,下邊開始介紹。 java
全部的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
其實應該說這個命令多數人仍是比較熟悉的,通常咱們想要防止程序啓動兩次,或者判斷某java進程是否存活,都會採用該命令獲取系統當前運行的全部java進程,而後根據進程名判斷。固然也能夠以此得到對應進程的id(此id指JVM裏的LVMID,可是他和系統進程ID是一致的),而後kill他來結束程序。其用法以下:
github
語法結構: jsp [options] [hostid] 參數: -q 只輸出ID -l 顯示虛擬機執行的主類 -m 顯示傳給main的參數 -v 輸出啓動的JVM參數
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 — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)
這個命令能夠實時查看調整JVM的運行參數,須要注意的是該工具僅在linux下比較有用,win下雖有提供,可是限制很大 ,使用方法以下: 算法
語法結構: jinfo [options] pid 參數: -v 查看虛擬機顯式參數 -flag[+/-] 查看全部參數,+/-能夠添加/減小運行時參數 -sysprops 打印System.getProperties()的內容
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.
一般與jmap搭配使用,用來分析jmap生成的heapdump文件,其內置了一個簡單的HTTP服務器(哈哈,最近本身也在寫一個web服務器,發現其實大致原理挺簡單的,麻煩的在於對web應用接口、內部處理細節的設計,以及併發處理,目前已經實現一個簡版,有興趣的見:easy-httpserver ),能夠在瀏覽器中查看分析結果。實際上該工具用處不大,一方面其功能簡單,比起經常使用的VisualVM等工具備必定差距,另外一方面在生產環境中去進行比較耗資源的分析處理,估計對很多公司都是犯忌諱的事吧,通常都是把heapdump導到本地處理。
這裏就不介紹用法了,可自行谷歌裏百度。 瀏覽器
看名字就知道是和棧相關的,而棧裏邊存的則是各個線程的私有數據(局部變量表、方法出口、操做數棧、對象引用等),所以該命令就是用來生成當前虛擬機的線程快照的(threaddump,可用來分析虛擬機某線程長時間挺對的緣由,如死鎖、死循環、資源請求時間過長等)。 服務器
語法結構: jstack [ option ] pid 參數: -F當’jstack [-l] pid’沒有相應的時候強制打印棧信息 -l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表. -m打印java和native c/c++框架的全部棧信息. -h | -help打印幫助信息
這一部分主要有兩個工具:JConsole和VisualVM,這兩個都提供了很強大的功能,此次先不介紹了,等下篇結合小例子分析吧。
彷佛有點坑啊,困了,先睡了,最近心煩,等調整好繼續^_^。