JVM性能監控及故障處理工具
本篇我們將介紹JVM常用的一些工具,這些工具將是我們監控JVM狀態、處理故障和調優分析的利器。 不過在開始之前,我還是要先車扯兩句:工具終歸只是幫助我們我們處理問題的,想要快速準確的解決問題,最為關鍵的還是對內在理論的理解和豐富的實踐經驗,所以如果對JVM的內存處理機制不了解,還是要用心學習一下。好了, 子曰:“工欲善其事,必先利其器。“,下邊開始介紹。
一、JDK命令行工具
所有的java開發人員都知道JDK的bin目錄下存放著編譯java需要的javac,以及運行java程序需要的java這兩個命令工具,但是很多人并沒有注意到,其實除了這兩個工具,該目錄下還有很多工具,這些工具其實為我們提供了很多方便且強大的功能,以下是部分截圖(各工具作用見:jdk/jre bin下工具介紹):
本篇我們只關注監控和故障處理相關的工具,見下表:
名稱 | 作用 |
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 ,顯示虛擬機線程快照 |
下邊我們來看一下每個的簡單用法:
1、jps
其實應該說這個命令多數人還是比較熟悉的,一般我們想要防止程序啟動兩次,或者判斷某java進程是否存活,都會采用該命令獲取系統當前運行的所有java進程,然后根據進程名判斷。當然也可以以此獲得對應進程的id(此id指JVM里的LVMID,但是他和系統進程ID是一致的),然后kill他來結束程序。其用法如下:
語法結構: jsp [options] [hostid] 參數: -q 只輸出ID -l 顯示虛擬機執行的主類 -m 顯示傳給main的參數 -v 輸出啟動的JVM參數
2、jstat
jstat用于監控虛擬機各種運行狀態信息,可以顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI的情況下他是性能分析的首選工具。
語法結構: 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 — 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒)
3、jinfo
這個命令可以實時查看調整JVM的運行參數,需要注意的是該工具僅在linux下比較有用,win下雖有提供,但是限制很大 ,使用方法如下:
語法結構: jinfo [options] pid 參數: -v 查看虛擬機顯式參數 -flag[+/-] 查看所有參數,+/-可以添加/減少運行時參數 -sysprops 打印System.getProperties()的內容
4、jmap
jmap用于生成堆轉儲快照(heapdump,用于JVM內存狀態分析,是故障處理或調優的關鍵參考數據),還可以查詢finalize隊列,java堆和永久代詳細信息。此外,該工具同樣在win下是個殘廢。
語法結構: 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.
5、jhat
通常與jmap搭配使用,用來分析jmap生成的heapdump文件,其內置了一個簡單的HTTP服務器(哈哈,最近自己也在寫一個web服務器,發現其實大體原理挺簡單的,麻煩的在于對web應用接口、內部處理細節的設計,以及并發處理,目前已經實現一個簡版,有興趣的見:easy-httpserver ),可以在瀏覽器中查看分析結果。實際上該工具用處不大,一方面其功能簡單,比起常用的VisualVM等工具有一定差距,另一方面在生產環境中去進行比較耗資源的分析處理,估計對不少公司都是犯忌諱的事吧,一般都是把heapdump導到本地處理。
這里就不介紹用法了,可自行谷歌里百度。
6、jstack
看名字就知道是和棧相關的,而棧里邊存的則是各個線程的私有數據(局部變量表、方法出口、操作數棧、對象引用等),因此該命令就是用來生成當前虛擬機的線程快照的(threaddump,可用來分析虛擬機某線程長時間挺對的原因,如死鎖、死循環、資源請求時間過長等)。
語法結構: jstack [ option ] pid 參數: -F當’jstack [-l] pid’沒有相應的時候強制打印棧信息 -l長列表. 打印關于鎖的附加信息,例如屬于java.util.concurrent的ownable synchronizers列表. -m打印java和native c/c++框架的所有棧信息. -h | -help打印幫助信息
二、JDK可視化工具
這一部分主要有兩個工具:JConsole和VisualVM,這兩個都提供了很強大的功能,這次先不介紹了。