JDK的命令行工具系列 (一) jps、jstat

概述

在咱們進行故障定位和性能分析時, 可使用Java Dump(也叫Dump文件)來幫助排查問題, 它記錄了JVM運行期間的內存佔用和線程執行等狀況。其中Heap Dump文件是二進制格式, 它保存了某一時刻的系統信息、虛擬機屬性、完整的線程Dump、全部類和對象的狀態等, 是指定時刻的java堆棧的快照; Thread Dump文件是純文本格式, 它保存了java應用程序各線程在某一時刻的運行位置。html

%JAVA_HOME%\lib目錄下, 有一些諸如jps.exe、jstack.exe、jmap.exe的命令行工具, 它們主要是用來監視虛擬機和故障處理的。java

名稱 主要做用
jps 顯示當前系統的java進程和id號
jstat 監視虛擬機各類運行狀態信息, 如進程中的類裝載、內存、垃圾收集、JIT編譯等運行參數
jinfo 實時查看和調整虛擬機各項參數
jmap 生成虛擬機的內存轉儲快照(heap dump文件)
jhat 用於分析heap dump文件,它會創建一個HTTP/HTML服務器,讓用戶能夠在瀏覽器上查看分析結果
jstack 生成虛擬機指定時刻的線程快照(thread dump文件)

jps: 虛擬機進程情況工具

咱們先本身編寫一個類:linux

import java.util.Arrays;

public class JpsDemo {
    public static void main(String[] args) {
        while(true){
            System.out.println(Arrays.toString(args));
            System.out.println(1);
        }
    }
}

dos命令行下, 使用javac命令編譯、java命令運行, 並給main()方法傳遞參數 88 66。瀏覽器

jps -help  幫助指令服務器

jps -q  只顯示pid, 不顯示class名稱、jar名稱和和傳遞給main 方法的參數工具

jps -m  顯示pid, class名稱和傳遞給main 方法的參數
性能

jps -l  顯示應用程序主類的完整package名 或者 應用程序的jar文件完整路徑名學習

jps -v  顯示傳遞給JVM的參數spa

jps、jstack這些指令都是基於一個實現機制: java應用程序在啓動時, 會在java.io.tmpdir指定的目錄下, 生成一個相似於hsperfdata_{username}的文件夾, 在這個文件夾下會有幾個文件, 文件名就是java進程的pid, JVM運行的一些參數均可以經過解析這幾個文件得到。例如在上面的JpsDemo類啓動後, 在我本身電腦上生成的臨時文件夾位置: C:\Users\liqingshan\AppData\Local\Temp\hsperfdata_qingshan, 以下所示, 文件名稱 5144 對應JpsDemo這個進程的pid命令行

jps失效處理

由此咱們得出, 上述全部操做都是基於/hsperfdata_{username}/pid文件來進行的。因此如當前用戶沒有權限寫hsperfdata_{username}目錄或磁盤已滿時、或在linux環境下/tmp臨時文件夾被定時任務清理掉, 都會致使沒法建立/hsperfdata_{username}/pid文件, 這樣就形成了jps、jstack、jmap這些相似的命令出現失效的狀況。具體的失效細節在本篇不作多解釋, 讀者可自行參考Java命令學習系列(一)中的jps失效處理小節。

jstat: 虛擬機統計信息監視工具

jstat是用於監視虛擬機各類運行狀態信息的命令行工具。它能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形的服務器上,它是運行期定位虛擬機性能問題的首選工具。

jstat命令格式: jstat [option vmid [interval [s|ms] [count] ] ], 下面是參數描述:

  • vmid  —虛擬機進程的pid。若是是本地虛擬機進程, 則vmidlvmid(即本地虛擬機進程pid)是一致的; 若是是遠程虛擬機進程, 則vmid的格式是: [protocol:] [//] lvmid [@hostname[:port]/servername]
  • interval  —查詢間隔, 單位爲秒或毫秒
  • count  —查詢次數

若是同時省略interval和count, 代表只查詢一次。假設須要每500毫秒查詢一次進程16744垃圾收集情況,一共查詢10次,則命令行應輸入:jstat -gc 16744 500 10

選項option表明用戶但願查詢的虛擬機信息,主要分爲3類:類裝載、垃圾收集和運行期編譯情況,具體選項及做用以下表:

選項 做用
-class 監視類裝載、卸載數量、總空間及類裝載所耗費的時間
-gc 監視Java堆情況,包括Eden區、2個Survivor區、老年代、永久代等的容量
-gccapacity 監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大和最小空間
-gcutil 監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與-gcutil功能同樣,可是會額外輸出致使上一次GC產生的緣由
-gcnew 監視新生代GC的情況
-gcnewcapacity 監視內容與-gcnew基本相同,但輸出主要關注使用到的最大和最小空間
-gcold 監視老年代GC的情況
-gcoldcapacity 監視內容與-gcold基本相同,輸出主要關注使用到的最大和最小空間
–gcpermcapacity 輸出永久代使用到的最大和最小空間
-compiler 輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已經被JIT編譯的方法

下面咱們就對錶格中的一些選項參數作個演示, 先別忘了隨便編寫個java程序跑起來, 而後輸入jstat命令(使用的運行環境是 JDK 1.8):

-class (監視類裝載、卸載數量、總空間以及耗費的時間)

C:\Users\liqingshan>jstat -class 16744
Loaded  Bytes  Unloaded  Bytes     Time
   430   880.6        0     0.0       0.05
  • Loaded : 裝載的類的數量
  • Bytes : 裝載類所佔用的字節數
  • Unloaded : 卸載類的數量
  • Bytes : 卸載類的字節數
  • Time : 裝載和卸載類所花費的時間

-compiler(輸出JIT編譯過的方法數量耗時等)

C:\Users\liqingshan>jstat -compiler 16744
Compiled Failed Invalid   Time   FailedType FailedMethod
     107      0       0     0.12          0
  • Compiled : 編譯任務執行數量
  • Failed : 編譯任務執行失敗數量
  • Invalid : 編譯任務執行失效數量
  • Time : 編譯任務消耗時間
  • FailedType : 最後一個編譯失敗任務的類型
  • FailedMethod : 最後一個編譯失敗任務所在的類及方法

-gc(垃圾回收堆的行爲統計經常使用命令

C:\Users\liqingshan>jstat -gc 16744
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0   0.0    64.0  24064.0  18288.8   87552.0     764.1    4864.0 2709.6 512.0  294.8     711    0.234   0      0.000    0.234
  • S0C : 新生代中第一個survivor的容量 (字節)
  • S1C : 新生代中第二個survivor的容量 (字節)
  • S0U : 新生代中第一個survivor目前已使用空間 (字節) 
  • S1C : 新生代中第二個survivor目前已使用空間 (字節)
  • EC : 新生代中Eden的容量 (字節)
  • EU : 新生代中Eden目前已使用空間 (字節)
  • OC : Old代的容量 (字節)
  • OU : Old代目前已使用空間 (字節)
  • MC : 方法區大小
  • MU : 方法區使用大小
  • CCSC : 壓縮類空間大小
  • CCSU : 壓縮類空間使用大小
  • YGC : 新生代垃圾回收次數
  • YGCT : 新生代垃圾回收時間
  • FGC : 老年代垃圾回收次數
  • FGCT : 老年代垃圾回收時間
  • GCT : 垃圾回收總消耗時

-gccapacity  (同-gc,還會輸出Java堆各區域使用到的最大、最小空間)

C:\Users\liqingshan>jstat -gccapacity 16744
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 43520.0 689152.0  30720.0  512.0  512.0  24064.0    87552.0  1379328.0    87552.0    87552.0      0.0 1056768.0   4864.0      0.0 1048576.0    512.0    884     0
  • NGCMN :新生代最小容量
  • NGCMX :新生代最大容量
  • NGC :當前新生代容量
  • S0C :第一個倖存區大小
  • S1C :第二個倖存區的大小
  • EC :伊甸園區的大小
  • OGCMN :老年代最小容量
  • OGCMX :老年代最大容量
  • OGC :當前老年代大小
  • OC  :  當前老年代大小
  • MCMN :  最小元數據容量
  • MCMX :最大元數據容量
  • MC :當前元數據空間大小
  • CCSMN :最小壓縮類空間大小
  • CCSMX :最大壓縮類空間大小
  • CCSC :當前壓縮類空間大小
  • YGC :年輕代gc次數
  • FGC :老年代GC次數

-gcnew(統計新生代行爲)

C:\Users\liqingshan>jstat -gcnew 16744
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
 512.0  512.0    0.0   64.0  1  15  512.0  24064.0   5294.2    947    0.279
  • S0C :第一個倖存區大小
  • S1C :第二個倖存區的大小
  • S0U :第一個倖存區的使用大小
  • S1U :第二個倖存區的使用大小
  • TT :  對象在新生代存活的次數
  • MTT :  對象在新生代存活的最大次數
  • DSS :  指望的倖存區大小
  • EC :伊甸園區的大小
  • EU :伊甸園區的使用大小
  • YGC :年輕代垃圾回收次數
  • YGCT :年輕代垃圾回收消耗時間

-gcnewcapacity(新生代與其相應的內存空間的統計)

C:\Users\liqingshan>jstat -gcnewcapacity 16744
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   43520.0   689152.0    30720.0 229376.0    512.0 229376.0    512.0   688128.0    24064.0  1054     0
  • NGCMN :新生代最小容量
  • NGCMX :新生代最大容量
  • NGC :當前新生代容量
  • S0CMX :最大幸存1區大小
  • S0C :當前倖存1區大小
  • S1CMX :最大幸存2區大小
  • S1C :當前倖存2區大小
  • ECMX :最大伊甸園區大小
  • EC :當前伊甸園區大小
  • YGC :年輕代垃圾回收次數
  • FGC :老年代回收次數

-gcold(統計老年代行爲)

C:\Users\liqingshan>jstat -gcold 16744
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
  4864.0   2709.6    512.0    294.8     87552.0       764.1   1097     0    0.000    0.309
  • MC :方法區大小
  • MU :方法區使用大小
  • CCSC :  壓縮類空間大小
  • CCSU :  壓縮類空間使用大小
  • OC :老年代大小
  • OU :老年代使用大小
  • YGC :年輕代垃圾回收次數
  • FGC :老年代垃圾回收次數
  • FGCT :老年代垃圾回收消耗時間
  • GCT :垃圾回收消耗總時間

-gcoldcapacity(老年代與其相應的內存空間的統計)

C:\Users\liqingshan>jstat -gcoldcapacity 16744
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
    87552.0   1379328.0     87552.0     87552.0  1120     0    0.000    0.313
  • OGCMN :老年代最小容量
  • OGCMX :老年代最大容量
  • OGC :當前老年代大小
  • OC :老年代大小
  • YGC :年輕代垃圾回收次數
  • FGC :老年代垃圾回收次數
  • FGCT :老年代垃圾回收消耗時間
  • GCT :垃圾回收消耗總時間

-gcmetacapacity   (元數據空間統計, 在jdk以前對應永久代區域)

C:\Users\liqingshan>jstat -gcmetacapacity 16744
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1056768.0     4864.0        0.0  1048576.0      512.0  1170     0    0.000    0.322
  • MCMN :  最小元數據容量
  • MCMX :最大元數據容量
  • MC :當前元數據空間大小
  • CCSMN :最小壓縮類空間大小
  • CCSMX :最大壓縮類空間大小
  • CCSC :當前壓縮類空間大小
  • YGC :年輕代垃圾回收次數
  • FGC :老年代垃圾回收次數
  • FGCT :老年代垃圾回收消耗時間
  • GCT :垃圾回收消耗總時間

-gcutil(同-gc,輸出的是已使用空間佔總空間的百分比)

C:\Users\liqingshan>jstat -gcutil 16744
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   6.25  62.00   0.87  55.71  57.57   1189    0.326     0    0.000    0.326
  • S0 :倖存1區當前使用比例
  • S1 :倖存2區當前使用比例
  • E :伊甸園區使用比例
  • O :老年代使用比例
  • M :元數據區使用比例
  • CCS :壓縮使用比例
  • YGC :新生代垃圾回收次數
  • YGCT :  新生代垃圾回收消耗時間
  • FGC :老年代垃圾回收次數
  • FGCT :老年代垃圾回收消耗時間
  • GCT :垃圾回收消耗總時間

-printcompilation(hotspot編譯方法統計)

C:\Users\liqingshan>jstat -printcompilation 16744
Compiled  Size  Type Method
     107    382    1 JpsDemo main
  • Compiled :被編譯方法的數量
  • Size :被編譯方法字節碼的字節數
  • Type :編譯類型
  • Method :編譯方法的類名和方法名

參考資料

《深刻理解Java虛擬機》

java程序性能分析之thread dump和heap dump

Java命令學習系列(零)——常見命令及Java Dump介紹-HollisChuang's Blo...

Java命令學習系列(一)——Jps-HollisChuang's Blog

Java命令學習系列(四)——jstat-HollisChuang's Blog

做者:張小凡
出處:https://www.cnblogs.com/qingshanli/ 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。若是以爲還有幫助的話,能夠點一下右下角的【推薦】。

相關文章
相關標籤/搜索