JVM性能監控工具

jps

  • USAGE:

      jps [-help]
      jps [-q] [-mlvV] [<hostid>]
    
  • OPTION

    • -q: 只輸出進程id,不輸出名稱
    • -m: 查看傳遞給main函數的參數
    • -l: 輸出main函數所在類的完整包名jar路徑
    • -v: 顯示傳遞給虛擬機的參數
    • -V: 輸出通過flag文件傳遞到JVM中的參數
    • -Joption: 傳遞參數給JVM,例如-J-Xms48m
    • <hostid>: 指定主機

jstat

  • DESCRIPTION: 查看JVM運行時的統計信息

  • USAGE:

    jstat -help|-options
    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
  • EXPLANATION:

    • -options: 下文提到的參數
    • vmid: 通過jps命令查出的進程id
  • OPTION

    • -statOption

      • -class: 顯示ClassLoader相關的統計信息

      • -compiler: 顯示JIT編譯器的統計信息

      • -gc: 顯示GC相關堆的統計信息

      • -gccapacity: 顯示各個代的容量以及使用情況

      • -gccause: 顯示垃圾收集的相關統計信息(同-gcutil),以及最近一次垃圾收集的誘發原因

      • -gcnew: 顯示新生代相關信息

      • -gcnewcapacity: 顯示新生代大小和使用情況

      • -gcold: 顯示老年代和元空間/永久區的相關信息

      • -gcoldcapacity: 顯示老年代的大小

      • -gcmetacapacity: 顯示元空間/永久區的大小

      • -gcutil: 顯示垃圾收集的相關統計信息

      • -printcompilation: 顯示編譯行為的統計信息

    • -t: 在第一行顯示一個Timestamp列表明程序的運行時間

    • -h: 在周期性輸出數據時, 多少行以后輸出一行表頭信息

    • interval: 指定輸出統計數據的時間周期, 單位為[s|ms]

    • count: 指定一共輸出多少次數據

  • EXAMPLE

    1. 每1秒輸出一次ClassLoader統計信息, 每5行打印一次表頭, 總共輸出10次
    • 輸入: jstat -class -t -h5 14927 1s 10
    • 輸出:
    Timestamp       Loaded  Bytes  Unloaded  Bytes     Time   
    56.3            394     817.2     0       0.0      0.04
    57.3            394     817.2     0       0.0      0.04
    58.3            394     817.2     0       0.0      0.04
    59.3            394     817.2     0       0.0      0.04
    60.3            394     817.2     0       0.0      0.04
    Timestamp       Loaded  Bytes  Unloaded  Bytes     Time   
    61.3            394     817.2     0       0.0      0.04
    62.3            394     817.2     0       0.0      0.04
    63.3            394     817.2     0       0.0      0.04
    64.3            394     817.2     0       0.0      0.04
    65.3            394     817.2     0       0.0      0.04
    

jinfo

  • DESCRIBE: 查看JAVA進程的配置信息, 包括Java系統屬性以及JVM命令行參數, 對于查找JVM默認參數十分有用, 在64-bit的JVM上使用需要使用-J-d64選項, 例如: jinfo -J-d64 -sysprops 14607

  • USAGE:

    jinfo [option] <pid>
      (to connect to running process)
    jinfo [option] <executable <core="">
      (to connect to a core file)
    jinfo [option] [server_id@]<remote server="" ip="" or="" hostname="">
      (to connect to remote debug server)</remote></executable></pid>
    
  • OPTION

    • no-option 以鍵值對的形式打印Java系統屬性以及JVM命令行參數

    • -flag name 打印指定的JVM命令行參數的鍵值對

    • -flag [+|-]name 設定指定JVM命令行參數的布爾值

    • -flag name=value 設定指定JVM命令行參數的值

    • -flags 以鍵值對的形式打印JVM命令行參數

    • -sysprops 以鍵值對的形式打印**Java系統屬性

  • EXAMPLE

    jinfo flag  PrintGCDetails 24984 # 顯示JVM是否有打印GC日志
    -XX:-PrintGCDetails # 沒有打印GC日志
    jinfo -flag  PrintGCDetails 21286 # 修改JVM參數, 使之打印GC日志
    
  • ATTENTION

    • jinfo支持修改部分JVM參數并立即生效, 但并不是所有的參數都支持動態修改

jmap

  • DESCRIBE: 導出java堆dump文件, 查看堆內對象的統計信息, 查看堆內對象實例統計信息, 查看Classloader信息以及finalizer隊列信息;在64-bit的JVM上使用需要使用-J-d64選項, 例如: jmap -J-d64 -heap pid

  • USAGE:

    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)
    
  • OPTION

    • <no option>: 沒有指定選項時, 會輸出所有共享的對象映射; 包括開始地址, 映射大小, 全路徑

    • -dump:[live,]format=b, file=filename: 將當前Java堆的快照以hprof二進制格式輸出到filename文件中;live選項是可選的, 但如果指定了, 只有活動的對象會被記錄到快照中; 可以使用jhat,Visual VM,MAT等工具查看得到的快照文件

    • -finalizerinfo: 打印正在等待釋放(在finalizer隊列中)的對象的信息

    • -heap: 查看進程堆內存使用情況,包括使用的GC算法、堆配置參數和各代中堆內存使用情況; 另外, String常量池的使用情況也會被打印出來

    • -histo[:live]: 打印堆信息的統計直方圖; 對于每個Java類, 會打印他們的類名, 對象數量, 內存占用等信息; JVM內部的類會以星號作為前綴打印, 如果帶上live選項則只統計活對象

    • -clstats: 打印類的統計信息

    • -F: 強制選項, 當使用jmap -dumpjmap -histo命令, 目標進程沒有響應時可使用-F選項, 這種情況下live選項將不被支持

  • EXAMPLE

    jmap -J-d64 -histo:live  25530
    
    num     #instances         #bytes  class name
    ----------------------------------------------
      1:           998          85592  [C
      2:           459          52512  java.lang.Class
      3:           504          25120  [Ljava.lang.Object;
      4:             8          24984  [B
      5:           987          23688  java.lang.String
      6:            79           5688  java.lang.reflect.Field
      7:           256           4096  java.lang.Integer
      8:           113           3616  java.util.Hashtable$Entry
      9:            90           3600  java.lang.ref.SoftReference
    

jhat

  • DESCRIPTION: JDK自帶的堆分析分析工具, jhat命令可以對Java堆快照文件進行分析, 它啟動一個HTTP服務器, 開發人員可以通過瀏覽器查看分析結果

  • USAGE:

    jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
    
  • OPTIONS:

    • -J<flag>: 直接傳遞參數到運行時系統, 例如: -J-mx512m指定使用的最大堆空間為512MB

    • -stack false: 關閉跟蹤對象分配調用堆棧

    • -refs false: 關閉對對象引用的跟蹤

    • -port <port>: 設置HTTP服務器的端口, 默認值是7000

    • -exclude <file>: Specify a file that lists data members that should be excluded from the reachableFrom query

    • -baseline <file>: Specify a baseline object dump. Objects in both heap dumps with the same ID and same class will be marked as not being "new"

    • -debug <int>: 設置debug級別

      • 0: 無debug輸出

      • 1: Debug hprof file parsing

      • 2: Debug hprof file parsing, no server

    • -version: 顯示版本號

    • -h|-help: 顯示幫助信息

    • <file>: 要分析的堆快照文件

jstack

  • DESCRIPTION: 導出應用程序的線程堆棧, jstack不僅能夠得到線程堆棧, 還能夠自動進行死鎖檢查, 輸出找到的死鎖信息

  • USAGE:

    jstack [-l] <pid>
          (to connect to running process)
    jstack -F [-m] [-l] <pid>
          (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
          (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
          (to connect to a remote debug server)
    
  • OPTIONS

    • -F: 在進程無響應時強制堆棧轉儲

    • -l: 會打印出額外的鎖信息,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況

    • -m: 不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(比如Native方法)

jstatd

  • DESCRIPTION: 用于遠程主機信息收集, 本質是一個RMI程序, 它的作用相當于代理服務器, 建立本地計算機與遠程監控工具的通訊, jstatd將本地計算機的Java程序信息發送給遠程計算機

  • USAGE

    1. 直接運行jstatd可能會出現拒絕訪問異常
    access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.setProperty(System.java:792)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
    

    這是因為jstatd沒有足夠的權限所致

    1. 新建一個jstatd.all.policy文件, 加入以下內容
    grant codebase "path/to/tools.jar" {
    permission java.security.Allpermission;
    };
    
    1. 然后使用以下命令開啟jstatd服務器, 默認情況下jstatd將會在1099端口開啟RMI服務
    jstatd -J-Djava.security.policy=path/to/jstatd.all.policy
    
    1. 使用jstat, jinfo, jmap等工具連接遠程jstatd服務器, 如:
    jstat -gcutil 460@localhost:1099  # 460是進程ID
    

jcmd

多功能命令行

hprof

性能統計工具(嵌入代碼中)

JConsole

JDK自帶圖形化性能監控工具

Visual VM

可視化多合一故障診斷和性能監控工具(替代命令行甚至JConsole), 支持插件, JDK7后集成于JDK中

Mission Control

來自JRockit的圖形化虛擬機診斷工具

使用飛行記錄器需要在程序中加上參數: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • ** 本文中使用到的JDK 為 Oracle JDK 1.7 ** JDK本身提供了很多方便的JVM性能調優監控工...
    FX_SKY閱讀 11,952評論 0 8
  • 當系統遇到一些問題或者異常的時候,我們往往會查看系統日志、JVM堆棧、GC日志,或者查看線程快照、堆轉儲快照等信息...
    wangmin閱讀 3,131評論 0 10
  • 最近在溫故《深入理解Java虛擬機》,對第四章的工具進行筆記記錄,備忘。 jps 用來查看正在運行的虛擬機進程,功...
    duval閱讀 743評論 0 0
  • 一、Linux下的性能監控工具 1.1 顯式系統整體資源使用情況-top命令 top命令的輸出可以分為兩個部分:前...
    端木軒閱讀 3,557評論 0 3
  • 參數設置 在Java虛擬機的參數中,有3種表示方法用“ps -ef |grep "java"命令,可以得到當前Ja...
    九問閱讀 9,171評論 2 52