JVM性能監控及故障處理工具

jopen 10年前發布 | 25K 次閱讀 JVM Java開發

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

一、JDK命令行工具

    所有的java開發人員都知道JDK的bin目錄下存放著編譯java需要的javac,以及運行java程序需要的java這兩個命令工具,但是很多人并沒有注意到,其實除了這兩個工具,該目錄下還有很多工具,這些工具其實為我們提供了很多方便且強大的功能,以下是部分截圖(各工具作用見:jdk/jre bin下工具介紹):

    JVM性能監控及故障處理工具

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

名稱     作用
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,這兩個都提供了很強大的功能,這次先不介紹了。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!