天天看點

JVM:JDK指令行工具常用工具介紹

文章目錄

  • 常用工具介紹
    • 1、jcmd:綜合工具
      • 指令格式
      • 參數描述
      • 應用示例
        • jcmd 或 jcmd -l
        • jcmd [pid] PerfCounter.print
        • jcmd [PID] help
        • 檢視具體指令的選項
    • 2、jps:虛拟機程序狀況工具
      • 指令格式
      • 參數說明
      • 應用示例
        • jps
        • jps -q
        • jps -m
        • jps -l
        • jps -v
    • 3、jstat:虛拟機統計資訊監視工具
      • 指令格式
      • 參數說明
      • 應用示例
        • jstat -class 類加載統計
        • jstat -compiler 編譯統計
        • jstat –gc 垃圾回收統計
        • jstat -gcmetacapacity 中繼資料空間統計
        • jstat -gcnew 新生代垃圾回收統計
        • jstat -gcnewcapacity 新生代記憶體統計
        • jstat -gcold 老年代垃圾回收統計
        • jstat -gcoldcapacity 老年記憶體統計
        • jstat -gcutil 整體垃圾回收統計
        • jstat -gccause 最近一次垃圾回收原因
        • jstat -printcompilation 目前VM執行的資訊
    • 4、jinfo:Java配置資訊工具
      • 指令格式
      • 參數說明
      • 應用示例
        • java -XX:+PrintFlagsFinal -version 輸出全部參數
        • java -XX:+PrintFlagsFinal -version |grep manageable 輸出可修改值的參數
        • jinfo 輸出目前 jvm 程序的全部參數和系統屬性
        • jinfo -flag 輸出對應名稱的參數
        • jinfo -flag [+|-] 開啟或關閉指定參數
        • jinfo -flag = 修改指定參數的值
        • jinfo -flags 輸出指定 全部參數
        • jinfo -sysprops 輸出指定目前 jvm 全部的系統屬性
    • 5、jmap:Java記憶體映像工具
      • 指令格式
      • 參數說明
        • 參數:
        • option 選項
      • 應用示例
        • jmap pid 檢視程序的記憶體映像資訊
        • jmap -heap 列印Java堆詳細資訊
        • jmap -histo:live 列印堆中對象的資訊
        • jmap -clstats 列印類加載器資訊
        • jmap -finalizerinfo 列印等待終結的對象資訊
        • jmap -dump:format=b,file=heapdump.txt 生成堆轉儲快照dump檔案
    • 6、jhat:虛拟機堆轉儲快照分析工具
      • 指令格式
      • 參數說明
      • 應用示例
    • 7、jstack:Java堆棧跟蹤工具
      • 指令格式
      • 參數說明
      • 應用示例
        • jstack 檢視指定程序的線程資訊

常用工具介紹

1、jcmd:綜合工具

将診斷指令請求發送到正在運作的Java虛拟機(JVM)。

指令格式

jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
 jcmd -l                                       jcmd -h  
           

參數描述

pid: 程序ID。

main class : 接收診斷指令請求的程序的main類。比對程序時,main類名稱中包含指定子字元串的任何程序均是比對的。如果多個正在運作的Java程序共享同一個main類,診斷指令請求将會發送到所有的這些程序中。

command:

jcmd 指令參數,通過 jcmd 【pid】 help ,檢視可用的參數

Perfcounter.print:

列印目标Java程序上可用的性能計數器。性能計數器的清單可能會随着Java程序的不同而産生變化。

-f file:

從檔案file中讀取指令,然後在目标Java程序上調用這些指令。在file中,每個指令必須寫在單獨的一行。以"#"開頭的行會被忽略。當所有行的指令被調用完畢後,或者讀取到含有stop關鍵字的指令,将會終止對file的處理。

-l:

檢視所有的程序清單資訊

-h:

檢視幫助資訊

應用示例

jcmd 或 jcmd -l

檢視程序清單

[[email protected] ~]# jcmd
14981 azkaban.execapp.AzkabanExecutorServer -conf ./internal/../../conf
13701 org.apache.hadoop.hdfs.qjournal.server.JournalNode
24934 org.apache.hadoop.hdfs.tools.DFSZKFailoverController
13703 org.apache.hadoop.hdfs.server.datanode.DataNode
28104 sun.tools.jcmd.JCmd
13163 org.apache.spark.deploy.yarn.ApplicationMaster --class org.apache.livy.rsc.driver.RSCDriverBootstrapper --properties-file /data/yarn/nm/usercache/root/appcache/application_1550467502257_0206/container_e51_1550467502257_0206_01_000001/__spark_conf__/__spark_conf__.properties
29105 org.apache.livy.server.LivyServer
19282 org.apache.hive.beeline.BeeLine
19893 com.cloudera.kafka.wrap.Kafka /var/run/cloudera-scm-agent/process/3197-kafka-KAFKA_BROKER/kafka.properties
19510 org.apache.hadoop.hdfs.server.namenode.NameNode
14871 org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer
           

jcmd [pid] PerfCounter.print

檢視性能統計

[[email protected] ~]# jcmd 29105 PerfCounter.print
29105:
java.ci.totalTime=16623259896
java.cls.loadedClasses=6804
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=0
java.property.java.endorsed.dirs="/data/jdk1.8.0_152/jre/lib/endorsed"
java.property.java.ext.dirs="/data/jdk1.8.0_152/jre/lib/ext:/usr/java/packages/lib/ext"
java.property.java.home="/data/jdk1.8.0_152/jre"
java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
java.property.java.version="1.8.0_152"
java.property.java.vm.info="mixed mode"
java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM"
java.property.java.vm.specification.name="Java Virtual Machine Specification"
java.property.java.vm.specification.vendor="Oracle Corporation"
java.property.java.vm.specification.version="1.8"
java.property.java.vm.vendor="Oracle Corporation"
java.property.java.vm.version="25.152-b16"

           

jcmd [PID] help

檢視程序可使用的參數

[[email protected] ~]# jcmd 29105 help
29105:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print       檢視線程堆棧資訊。
GC.class_stats
GC.class_histogram 檢視系統中類統計資訊
GC.heap_dump       檢視 JVM 的Heap Dump
GC.run_finalization 對 JVM 執行 java.lang.System.runFinalization()
GC.run             對 JVM 執行 java.lang.System.gc()
VM.uptime          檢視 jvm 啟動時長
VM.flags           檢視 JVM 的啟動參數
VM.system_properties   檢視 JVM 的屬性資訊
VM.command_line    檢視 JVM 的啟動指令行
VM.version         檢視目标jvm程序的版本資訊
help
           

JRF 指令

JRF 功能跟 jmc.exe 工具的飛行記錄器的功能一樣的。

要使用 JRF 相關的功能,必須使用 VM.unlock_commercial_features 參數取消鎖定商業功能 。

檢視具體指令的選項

如果想檢視指令的選項,比如想檢視 VM.flags 指令選項,可以通過如下指令:

jcmd 11772 help JFR.dump

[[email protected] ~]# jcmd 29105 help VM.flags
29105:
VM.flags
Print VM flag options and their current values.

Impact: Low

Permission: java.lang.management.ManagementPermission(monitor)

Syntax : VM.flags [options]

Options: (options must be specified using the <key> or <key>=<value> syntax)
	-all : [optional] Print all flags supported by the VM (BOOLEAN, false)

           

2、jps:虛拟機程序狀況工具

jps(JVM Process Status Tool)可以列出正在運作的虛拟機程序,并顯示虛拟機執行主類名稱以及這些程序的本地虛拟機唯一ID(Local Virtual Machine Identifier,LVMID)。

雖然功能比較單一,但它是使用頻率最高的JDK指令行工具,因為其他的JDK工具大多需要輸入它查詢到的LVMID來确定要監控的是哪一個虛拟機程序。對于本地虛拟機程序來說,LVMID與作業系統的程序ID(Process Identifier,PID)是一緻的。

指令格式

輸出JVM中運作的程序狀态資訊

jps [options] [hostid]

[[email protected] ~]# jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]
           

參數說明

-q:隻輸出程序 ID

-m:輸出傳入 main 方法的參數

-l:輸出完全的包名,應用主類名,jar的完全路徑名

-v:輸出jvm參數

-V:輸出通過flag檔案傳遞到JVM中的參數

應用示例

jps

jps 不帶參數,預設顯示 程序ID 和 啟動類的名稱。

[[email protected] ~]# jps
19893 Kafka
20223 QuorumPeerMain
           

jps -q

參數 -q 隻輸出程序ID,不顯示類的名稱

[[email protected]~]# jps -q
19893
20223
           

jps -m

參數 -m 輸出傳遞給 Java 程序(main 方法)的參數

[[email protected] ~]# jps -m
6756 Jps -m
19893 Kafka /var/run/cloudera-scm-agent/process/3197-kafka-KAFKA_BROKER/kafka.properties
20223 QuorumPeerMain /var/run/cloudera-scm-agent/process/3074-zookeeper-server/zoo.cfg
           

jps -l

參數 -l 可以輸出主函數的完整路徑

[[email protected] ~]# jps -l
19893 com.cloudera.kafka.wrap.Kafka
20223 org.apache.zookeeper.server.quorum.QuorumPeerMain
           

jps -v

參數 -v 可以顯示傳遞給 Java 虛拟機的參數

[[email protected] ~]# jps -v
19893 Kafka -Xmx1024M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/kafka_kafka-KAFKA_BROKER-c40b11bae2ae5ca0f7efce30901addb0_pid19893.hprof
           

3、jstat:虛拟機統計資訊監視工具

jstat(JVM Statistics Monitoring Tool)是用于監視虛拟機各種運作狀态資訊的指令行工具。它可以顯示本地或者遠端[1]虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,在沒有GUI圖形界面,隻提供了純文字控制台環境的伺服器上,它将是運作期定位虛拟機性能問題的首選工具。

指令格式

jstat[option vmid[interval[s|ms][count]]]

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

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as 
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.


option: 參數選項

-t: 可以在列印的列加上Timestamp列,用于顯示系統運作的時間

-h: 可以在周期性資料資料的時候,可以在指定輸出多少行以後輸出一次表頭

vmid: Virtual Machine ID( 程序的 pid)

interval: 執行每次的間隔時間,機關為毫秒

count: 用于指定輸出多少次記錄,預設則會一直列印
           

對于指令格式中的VMID與LVMID需要特别說明一下:如果是本地虛拟機程序,VMID與LVMID是一緻的,如果是遠端虛拟機程序,那VMID的格式應當是:

[protocol:][//]lvmid[@hostname[:port]/servername]
           

參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明隻查詢一次。假設需要每250毫秒查詢一次程序2764垃圾收集狀況,一共查詢20次,那指令應當是:

jstat-gc 2764 250 20
           

參數說明

[[email protected] ~]# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

           

-class: 監視類加載、解除安裝數量、總空間以及類裝在所耗費的時間

-compiler: 輸出JIT編譯器編譯過的方法、耗時資訊

-gc: 監視java堆狀況,包括 Eden 區、兩個Survivor區、老年代、永久代等的容量、已用空間、GC 時間合計等資訊

-gccapacity: 輸出内容同 -gc,主要關注java堆各個區域使用使用的最大、最小空間

-gccause: 同 -gcutil 功能,會額外輸出導緻上次GC産生的原因

-gcmetacapacity: 監視中繼資料空間使用情況

-gcnew: 監視新生代 GC 情況

-gcnewcapacity: 監視内容同 -gcnew,主要 關注使用的最大、最小空間

-gcold: 監視老年代 GC 情況

-gcoldcapacity: 監視内容同 -gcold,主要 關注使用的最大、最小空間

-gcutil: 輸出内容同 -gc,主要關注已使用空間占總空間的百分比

-printcompilation: 輸出已經被JIT編譯的方法

應用示例

jstat -class 類加載統計

[[email protected] ~]# jstat -class 29105
Loaded  Bytes  Unloaded  Bytes     Time   
  6804 13733.8        0     0.0       1.94

           
  • Loaded : 已經裝載的類的數量
  • Bytes : 裝載類所占用的位元組數
  • Unloaded:已經解除安裝類的數量
  • Bytes:解除安裝類的位元組數
  • Time:裝載和解除安裝類所花費的時間

jstat -compiler 編譯統計

[[email protected] ~]# jstat -compiler 29105
Compiled Failed Invalid   Time   FailedType FailedMethod
    7822      0       0    17.12          0             
           
  • Compiled:編譯任務執行數量
  • Failed:編譯任務執行失敗數量
  • Invalid :編譯任務執行失效數量
  • Time :編譯任務消耗時間
  • FailedType:最後一個編譯失敗任務的類型
  • FailedMethod:最後一個編譯失敗任務所在的類及方法

jstat –gc 垃圾回收統計

[[email protected] ~]# jstat -gc 29105
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
20992.0 20480.0  0.0   1686.6 1626112.0 404770.7  317440.0   25081.6   41680.0 41065.1 5632.0 5435.2      9    0.055   2      0.100    0.155

           
  • S0C:年輕代中第一個survivor(幸存區)的容量 (位元組)
  • S1C:年輕代中第二個survivor(幸存區)的容量 (位元組)
  • S0U :年輕代中第一個survivor(幸存區)目前已使用空間 (位元組)
  • S1U :年輕代中第二個survivor(幸存區)目前已使用空間 (位元組)
  • EC :年輕代中Eden(伊甸園)的容量 (位元組)
  • EU :年輕代中Eden(伊甸園)目前已使用空間 (位元組)
  • OC :Old代的容量 (位元組)
  • OU :Old代目前已使用空間 (位元組)
  • MC:metaspace(元空間)的容量 (位元組)
  • MU:metaspace(元空間)目前已使用空間 (位元組)
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • YGCT :從應用程式啟動到采樣時年輕代中gc所用時間(s)
  • FGC :從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT :從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)

#### jstat -gccapacity 堆記憶體統計

[[email protected] ~]# jstat -gccapacity 29105
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
342528.0 5479424.0 2329088.0 20992.0 20480.0 1626112.0   685568.0 10959872.0   317440.0   317440.0      0.0 1085440.0  41680.0      0.0 1048576.0   5632.0      9     2
           
  • NGCMN :年輕代(young)中初始化(最小)的大小(位元組)
  • NGCMX :年輕代(young)的最大容量 (位元組)
  • NGC :年輕代(young)中目前的容量 (位元組)
  • S0C :年輕代中第一個survivor(幸存區)的容量 (位元組)
  • S1C : 年輕代中第二個survivor(幸存區)的容量 (位元組)
  • EC :年輕代中Eden(伊甸園)的容量 (位元組)
  • OGCMN :old代中初始化(最小)的大小 (位元組)
  • OGCMX :old代的最大容量(位元組)
  • OGC:old代目前新生成的容量 (位元組)
  • OC :Old代的容量 (位元組)
  • MCMN:metaspace(元空間)中初始化(最小)的大小 (位元組)
  • MCMX :metaspace(元空間)的最大容量 (位元組)
  • MC :metaspace(元空間)目前新生成的容量 (位元組)
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:目前壓縮類空間大小
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • FGC:從應用程式啟動到采樣時old代(全gc)gc次數

jstat -gcmetacapacity 中繼資料空間統計

[[email protected] ~]# jstat -gcmetacapacity 29105
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1085440.0    41680.0        0.0  1048576.0     5632.0     9     2    0.100    0.155
           
  • MCMN:最小中繼資料容量
  • MCMX:最大中繼資料容量
  • MC:目前中繼資料空間大小
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:目前壓縮類空間大小
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • FGC :從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT :從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)

jstat -gcnew 新生代垃圾回收統計

[[email protected] ~]# jstat -gcnew 29105
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
20992.0 20480.0    0.0 1686.6  2  15 20992.0 1626112.0 445487.1      9    0.055

           
  • S0C :年輕代中第一個survivor(幸存區)的容量 (位元組)
  • S1C :年輕代中第二個survivor(幸存區)的容量 (位元組)
  • S0U :年輕代中第一個survivor(幸存區)目前已使用空間 (位元組)
  • S1U :年輕代中第二個survivor(幸存區)目前已使用空間 (位元組)
  • TT:持有次數限制
  • MTT:最大持有次數限制
  • DSS:期望的幸存區大小
  • EC:年輕代中Eden(伊甸園)的容量 (位元組)
  • EU :年輕代中Eden(伊甸園)目前已使用空間 (位元組)
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • YGCT:從應用程式啟動到采樣時年輕代中gc所用時間(s)

jstat -gcnewcapacity 新生代記憶體統計

[[email protected] ~]# jstat -gcnewcapacity 29105
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
  342528.0  5479424.0  2329088.0 1826304.0  20992.0 1826304.0  20480.0  5478400.0  1626112.0     9     2

           
  • NGCMN :年輕代(young)中初始化(最小)的大小(位元組)
  • NGCMX :年輕代(young)的最大容量 (位元組)
  • NGC :年輕代(young)中目前的容量 (位元組)
  • S0CMX :年輕代中第一個survivor(幸存區)的最大容量 (位元組)
  • S0C :年輕代中第一個survivor(幸存區)的容量 (位元組)
  • S1CMX :年輕代中第二個survivor(幸存區)的最大容量 (位元組)
  • S1C:年輕代中第二個survivor(幸存區)的容量 (位元組)
  • ECMX:年輕代中Eden(伊甸園)的最大容量 (位元組)
  • EC:年輕代中Eden(伊甸園)的容量 (位元組)
  • YGC:從應用程式啟動到采樣時年輕代中gc次數
  • FGC:從應用程式啟動到采樣時old代(全gc)gc次數

jstat -gcold 老年代垃圾回收統計

[[email protected] ~]# jstat -gcold 29105
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 41680.0  41065.1   5632.0   5435.2    317440.0     25081.6      9     2    0.100    0.155
           
  • MC :metaspace(元空間)的容量 (位元組)
  • MU:metaspace(元空間)目前已使用空間 (位元組)
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • OC:Old代的容量 (位元組)
  • OU:Old代目前已使用空間 (位元組)
  • YGC:從應用程式啟動到采樣時年輕代中gc次數
  • FGC:從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT:從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)

jstat -gcoldcapacity 老年記憶體統計

[[email protected] ~]# jstat -gcoldcapacity 29105
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   685568.0  10959872.0    317440.0    317440.0     9     2    0.100    0.155

           
  • OGCMN :old代中初始化(最小)的大小 (位元組)
  • OGCMX :old代的最大容量(位元組)
  • OGC :old代目前新生成的容量 (位元組)
  • OC :Old代的容量 (位元組)
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • FGC :從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT :從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)

jstat -gcutil 整體垃圾回收統計

[[email protected] ~]# jstat -gcutil 29105
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   8.24  29.91   7.90  98.52  96.51      9    0.055     2    0.100    0.155

           
  • S0 :年輕代中第一個survivor(幸存區)已使用的占目前容量百分比
  • S1 :年輕代中第二個survivor(幸存區)已使用的占目前容量百分比
  • E :年輕代中Eden(伊甸園)已使用的占目前容量百分比
  • O :old代已使用的占目前容量百分比
  • P :perm代已使用的占目前容量百分比
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • YGCT :從應用程式啟動到采樣時年輕代中gc所用時間(s)
  • FGC :從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT :從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)

jstat -gccause 最近一次垃圾回收原因

[[email protected] ~]# jstat -gccause 29105
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
  0.00   8.24  30.40   7.90  98.52  96.51      9    0.055     2    0.100    0.155 Allocation Failure   No GC 
           
  • S0 :年輕代中第一個survivor(幸存區)已使用的占目前容量百分比
  • S1 :年輕代中第二個survivor(幸存區)已使用的占目前容量百分比
  • E :年輕代中Eden(伊甸園)已使用的占目前容量百分比
  • O :old代已使用的占目前容量百分比
  • M : 中繼資料區使用比例
  • CCS :壓縮使用比例
  • YGC :從應用程式啟動到采樣時年輕代中gc次數
  • YGCT :從應用程式啟動到采樣時年輕代中gc所用時間(s)
  • FGC :從應用程式啟動到采樣時old代(全gc)gc次數
  • FGCT :從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
  • GCT:從應用程式啟動到采樣時gc用的總時間(s)
  • LGCC:最後一次GC原因
  • GCC:目前GC原因(No GC 為目前沒有執行GC)

jstat -printcompilation 目前VM執行的資訊

[[email protected] ~]# jstat -printcompilation 29105
Compiled  Size  Type Method
    7839     17    1 java/util/regex/Pattern$CharProperty$1 isSatisfiedBy

           
  • Compiled :編譯任務的數目
  • Size :方法生成的位元組碼的大小
  • Type:編譯類型
  • Method:類名和方法名用來辨別編譯的方法。類名使用/做為一個命名空間分隔符。方法名是給定類中的方法。上述格式是由-XX:+PrintComplation選項進行設定的

4、jinfo:Java配置資訊工具

jinfo(Configuration Info for Java)的作用是實時地檢視和調整虛拟機各項參數。

使用jps指令的-v參數可以檢視虛拟機啟動時顯式指定的參數清單,但如果想知道未被顯式指定的參數的系統預設值,除了去找資料外,就隻能使用jinfo的-flag選項進行查詢了(如果隻限于JDK 1.6或以上版本的話,使用java-XX:+PrintFlagsFinal檢視參數預設值也是一個很好的選擇),jinfo還可以使用-sysprops選項把虛拟機程序的System.getProperties()的内容列印出來。

指令格式

[[email protected] ~]# jinfo -h
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)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

           

參數說明

無參數 輸出全部的參數和系統屬性

-flag name 輸出對應名稱的參數

-flag [+|-]name 開啟或者關閉對應名稱的參數

-flag name=value 設定對應名稱的參數

-flags 輸出全部的參數

-sysprops 輸出系統屬性

應用示例

java -XX:+PrintFlagsFinal -version 輸出全部參數

[[email protected] ~]# java -XX:+PrintFlagsFinal -version
[Global flags]
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
    uintx AdaptiveSizePolicyWeight                  = 10                                  {product}
    uintx AdaptiveSizeThroughPutPolicy              = 0                                   {product}
    uintx AdaptiveTimeWeight                        = 25                                  {product}
     bool AdjustConcurrency                         = false                               {product}
     bool AggressiveOpts                            = false                               {product}
     intx AliasLevel                                = 3                                   {C2 product}
     bool AlignVector                               = false                               {C2 product}
     intx AllocateInstancePrefetchLines             = 1                                   {product}
     intx AllocatePrefetchDistance                  = 192                                 {product}
     intx AllocatePrefetchInstr                     = 3                                   {product}
     intx AllocatePrefetchLines                     = 4                                   {product}
     intx AllocatePrefetchStepSize                  = 64                                  {product}
     intx AllocatePrefetchStyle                     = 1                                   {product}
     bool AllowJNIEnvProxy                          = false                               {product}
     bool AllowNonVirtualCalls                      = false                               {product}
     bool AllowParallelDefineClass                  = false                               {product}
     bool AllowUserSignalHandlers                   = false                               {product}
-----------------------省略-------------------------
           

java -XX:+PrintFlagsFinal -version |grep manageable 輸出可修改值的參數

[[email protected] ~]# java -XX:+PrintFlagsFinal -version |grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
     intx CMSTriggerInterval                        = -1                                  {manageable}
     intx CMSWaitDuration                           = 2000                                {manageable}
     bool HeapDumpAfterFullGC                       = false                               {manageable}
     bool HeapDumpBeforeFullGC                      = false                               {manageable}
     bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
    ccstr HeapDumpPath                              =                                     {manageable}
    uintx MaxHeapFreeRatio                          = 100                                 {manageable}
    uintx MinHeapFreeRatio                          = 0                                   {manageable}
     bool PrintClassHistogram                       = false                               {manageable}
     bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
     bool PrintConcurrentLocks                      = false                               {manageable}
     bool PrintGC                                   = false                               {manageable}
     bool PrintGCDateStamps                         = false                               {manageable}
     bool PrintGCDetails                            = false                               {manageable}
     bool PrintGCID                                 = false                               {manageable}
     bool PrintGCTimeStamps                         = false                               {manageable}

           

jinfo 輸出目前 jvm 程序的全部參數和系統屬性

[[email protected] ~]# jinfo 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Java System Properties:

com.sun.management.jmxremote.authenticate = false
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.152-b16
sun.boot.library.path = /data/jdk1.8.0_152/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
java.rmi.server.randomIDs = true
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /root
----------------------省略-------------------
           

jinfo -flag 輸出對應名稱的參數

[r[email protected] ~]# jinfo -flag UseParallelGC 20105
-XX:+UseParallelGC

           

jinfo -flag [+|-] 開啟或關閉指定參數

[[email protected] ~]# jinfo -flag +PrintGC 20105
[[email protected] ~]# jinfo -flag PrintGC 20105
-XX:+PrintGC
           

jinfo -flag = 修改指定參數的值

修改之前
[[email protected] ~]# jinfo -flag PrintGCDetails 20105
-XX:-PrintGCDetails
修改指令
[[email protected] ~]# jinfo -flag PrintGCDetails=1 20105
修改之後
[roo[email protected] ~]# jinfo -flag PrintGCDetails 20105
-XX:+PrintGCDetails

           

jinfo -flags 輸出指定 全部參數

[[email protected] ~]# jinfo -flags 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=1052770304 -XX:+ManagementServer -XX:MaxHeapSize=16833839104 -XX:MaxNewSize=5610930176 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=350748672 -XX:OldSize=702021632 -XX:+PrintGC -XX:-PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line:  -Djava.rmi.server.hostname=192.168.12.201 -Dcom.sun.management.jmxremote.port=19889 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

           

jinfo -sysprops 輸出指定目前 jvm 全部的系統屬性

[[email protected] ~]# jinfo -sysprops 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
com.sun.management.jmxremote.authenticate = false
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.152-b16
sun.boot.library.path = /data/jdk1.8.0_152/jre/lib/amd64
livy.server.server-url = http://hadoop-slave2:9889
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
java.rmi.server.randomIDs = true
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /root
java.vm.specification.name = Java Virtual Machine Specification
com.sun.management.jmxremote.port = 19889
java.runtime.version = 1.8.0_152-b16
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /data/jdk1.8.0_152/jre/lib/endorsed
----------------------省略--------------------------
           

5、jmap:Java記憶體映像工具

jmap(Memory Map for Java)指令用于生成堆轉儲快照(一般稱為heapdump或dump檔案)。

如果不使用jmap指令,要想擷取Java堆轉儲快照,還有一些比較“暴力”的手段:

-XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛拟機在OOM異常出現之後自動生成dump檔案

-XX:+HeapDumpOnCtrlBreak參數則可以使用[Ctrl]+[Break]鍵讓虛拟機生成dump檔案
           

jmap的作用并不僅僅是為了擷取dump檔案,它還可以查詢finalize執行隊列、Java堆和永久代的詳細資訊,如空間使用率、目前用的是哪種收集器等。

指令格式

jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
           

參數說明

[[email protected] ~]# jmap -h
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)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

           

參數:

option: 選項參數。

pid: 需要列印配置資訊的程序ID。

executable: 産生核心dump的Java可執行檔案。

core: 需要列印配置資訊的核心檔案。

server-id 可選的唯一id,如果相同的遠端主機上運作了多台調試伺服器,用此選項參數辨別伺服器。

remote server IP or hostname 遠端調試伺服器的IP位址或主機名。

option 選項

no option: 檢視程序的記憶體映像資訊,類似 Solaris pmap 指令。

heap: 顯示Java堆詳細資訊

histo[:live]: 顯示堆中對象的統計資訊

clstats: 列印類加載器資訊

finalizerinfo: 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象

dump:: 生成堆轉儲快照

**F: ** 如果pid沒有響應,請使用jmap -dump或jmap -histo選項。此模式下,live子參數無效.

help: 列印幫助資訊

J: 指定傳遞給運作jmap的JVM的參數

應用示例

jmap pid 檢視程序的記憶體映像資訊

[[email protected] ~]# jmap 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
0x0000000000400000	7K	/data/jdk1.8.0_152/bin/java
0x00007fdd2c83a000	86K	/usr/lib64/libgcc_s-4.8.5-20150702.so.1
0x00007fdd58002000	251K	/data/jdk1.8.0_152/jre/lib/amd64/libsunec.so
0x00007fdd5a86d000	7K	/data/jdk1.8.0_152/jre/lib/amd64/libjaas_unix.so
0x00007fdd6421c000	91K	/data/jdk1.8.0_152/jre/lib/amd64/libnio.so
0x00007fdd6472e000	112K	/data/jdk1.8.0_152/jre/lib/amd64/libnet.so
0x00007fdd64945000	49K	/data/jdk1.8.0_152/jre/lib/amd64/libmanagement.so
0x00007fdd8cbac000	125K	/data/jdk1.8.0_152/jre/lib/amd64/libzip.so
0x00007fdd8cdc8000	60K	/usr/lib64/libnss_files-2.17.so
0x00007fdd8cfdb000	221K	/data/jdk1.8.0_152/jre/lib/amd64/libjava.so
0x00007fdd8d207000	64K	/data/jdk1.8.0_152/jre/lib/amd64/libverify.so
0x00007fdd8d416000	43K	/usr/lib64/librt-2.17.so
0x00007fdd8d61e000	1112K	/usr/lib64/libm-2.17.so
0x00007fdd8d920000	16640K	/data/jdk1.8.0_152/jre/lib/amd64/server/libjvm.so
0x00007fdd8e91c000	2077K	/usr/lib64/libc-2.17.so
0x00007fdd8ecdf000	19K	/usr/lib64/libdl-2.17.so
0x00007fdd8eee3000	101K	/data/jdk1.8.0_152/lib/amd64/jli/libjli.so
0x00007fdd8f0f9000	141K	/usr/lib64/libpthread-2.17.so
0x00007fdd8f315000	160K	/usr/lib64/ld-2.17.so

           

jmap -heap 列印Java堆詳細資訊

列印一個程序堆的摘要資訊,包括使用的GC算法、堆配置資訊和各記憶體區域記憶體使用資訊

[[email protected] ~]# jmap -heap  20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 16833839104 (16054.0MB)
   NewSize                  = 350748672 (334.5MB)
   MaxNewSize               = 5610930176 (5351.0MB)
   OldSize                  = 702021632 (669.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 495976448 (473.0MB)
   used     = 394750680 (376.46358489990234MB)
   free     = 101225768 (96.53641510009766MB)
   79.59060991541276% used
From Space:
   capacity = 43515904 (41.5MB)
   used     = 4820096 (4.5968017578125MB)
   free     = 38695808 (36.9031982421875MB)
   11.076630741716867% used
To Space:
   capacity = 43515904 (41.5MB)
   used     = 0 (0.0MB)
   free     = 43515904 (41.5MB)
   0.0% used
PS Old Generation
   capacity = 327680000 (312.5MB)
   used     = 19327496 (18.43213653564453MB)
   free     = 308352504 (294.06786346435547MB)
   5.89828369140625% used

13208 interned Strings occupying 1158728 bytes.

           

jmap -histo:live 列印堆中對象的資訊

其中包括每個Java類、對象數量、記憶體大小(機關:位元組)、完全限定的類名。VM内部類名稱使用“*”字首列印。 如果指定了live子選項,則隻計算活動的對象。

[[email protected] ~]# jmap -histo:live 20105
2439:             1             16  sun.security.x509.GeneralNames
2440:             1             16  sun.security.x509.RFC822Name
2441:             1             16  sun.text.normalizer.NormalizerBase$Mode
2442:             1             16  sun.text.normalizer.NormalizerBase$NFCMode
2443:             1             16  sun.text.normalizer.NormalizerBase$NFDMode
2444:             1             16  sun.text.normalizer.NormalizerBase$NFKCMode
2445:             1             16  sun.text.normalizer.NormalizerBase$NFKDMode
2446:             1             16  sun.util.calendar.Gregorian
2447:             1             16  sun.util.locale.provider.AuxLocaleProviderAdapter$NullProvider
2448:             1             16  sun.util.locale.provider.CalendarDataUtility$CalendarWeekParameterGetter
2449:             1             16  sun.util.locale.provider.SPILocaleProviderAdapter
2450:             1             16  sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
2451:             1             16  sun.util.resources.LocaleData
2452:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total        170196       10622016

           

jmap -clstats 列印類加載器資訊

-clstats 是 -permstat的替代方案,在JDK8之前,-permstat用來列印類加載器的資料

列印Java堆記憶體的永久儲存區域的類加載器的智能統計資訊。對于每個類加載器而言,它的名稱、活躍度、位址、父類加載器、它所加載的類的數量和大小都會被列印。此外,包含的字元串數量和大小也會被列印。

[[email protected] ~]# jmap -clstats 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness......................liveness analysis may be inaccurate ...
class_loader	classes	bytes	parent_loader	alive?	type

<bootstrap>	2030	3517229	  null  	live	<internal>
0x00000003d4a243a0	5019	8316626	0x00000003d4a2de50	live	sun/misc/[email protected]
0x00000003d535e570	1	1473	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535ebb0	1	880	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6d720	1	880	  null  	dead	sun/reflect/[email protected]
0x00000003d535e638	1	881	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535ec78	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6d1a8	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4f0e260	1	880	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535ea20	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535f220	1	1471	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6d270	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6dd30	1	880	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6e2f0	4	4029	  null  	dead	javax/management/remote/rmi/[email protected]
0x00000003d4f0e328	1	1474	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535eae8	1	1474	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6d338	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6def8	1	1471	  null  	dead	sun/reflect/[email protected]
0x00000003d4f0e0d0	1	1474	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d530be50	6	10342	  null  	live	com/esotericsoftware/reflectasm/[email protected]
0x00000003d535e890	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535f090	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6d400	1	1472	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6dfc0	1	1471	  null  	dead	sun/reflect/[email protected]
0x00000003d4f0e198	1	1472	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d538e9d0	0	0	0x00000003d4a243a0	live	com/esotericsoftware/reflectasm/[email protected]
0x00000003d4d3d4b8	0	0	0x00000003d4a243a0	dead	java/util/[email protected]
0x00000003d535e958	1	881	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535f158	1	1494	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6d4c8	1	1474	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6e088	1	1471	  null  	dead	sun/reflect/[email protected]
0x00000003d4a2de50	36	112511	  null  	live	sun/misc/[email protected]
0x00000003d535e700	1	1471	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535ed40	1	1472	  null  	dead	sun/reflect/[email protected]
0x00000003d535ef00	1	1473	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d4a6d590	1	880	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6e150	1	1471	  null  	dead	sun/reflect/[email protected]
0x00000003d4f0e008	1	880	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535e7c8	1	881	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535ee08	1	880	0x00000003d4a243a0	dead	sun/reflect/[email protected]
0x00000003d535efc8	1	1473	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6d658	1	880	  null  	dead	sun/reflect/[email protected]
0x00000003d4a6e218	2	4839	  null  	dead	javax/management/remote/rmi/[email protected]

total = 43	7132	12010607	    N/A    	alive=5, dead=38	    N/A    


           

jmap -finalizerinfo 列印等待終結的對象資訊

[[email protected] ~]# jmap -finalizerinfo 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Number of objects pending for finalization: 0

           

jmap -dump:format=b,file=heapdump.txt 生成堆轉儲快照dump檔案

詳見:https://blog.csdn.net/u010647035/article/details/86563736

6、jhat:虛拟機堆轉儲快照分析工具

Sun JDK提供jhat(JVM Heap Analysis Tool)指令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat内置了一個微型的HTTP/HTML伺服器,生成dump的分析結果後,可以在浏覽器中檢視。在此要注意,一般不會直接在伺服器上進行分析,因為jhat是一個耗時并且耗費硬體資源的過程,一般把伺服器生成的dump檔案複制到本地或其他機器上進行分析。

推薦好用的分析工具:https://blog.csdn.net/u010647035/article/details/86563736

指令格式

jhat [ options ]

參數說明

[[email protected] ~]# jhat -h
Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

	-J<flag>          Pass <flag> directly to the runtime system. For
			  example, -J-mx512m to use a maximum heap size of 512MB
	-stack false:     Turn off tracking object allocation call stack.
	-refs false:      Turn off tracking of references to objects
	-port <port>:     Set the port for the HTTP server.  Defaults to 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>:     Set debug level.
			    0:  No debug output
			    1:  Debug hprof file parsing
			    2:  Debug hprof file parsing, no server
	-version          Report version number
	-h|-help          Print this help and exit
	<file>            The file to read

For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".

All boolean options default to "true"

           

**-J< flag > **

因為 jhat 指令實際上會啟動一個JVM來執行, 通過 -J 可以在啟動JVM時傳入一些啟動參數. 例如, -J-Xmx512m 則指定運作 jhat 的Java虛拟機使用的最大堆記憶體為 512 MB. 如果需要使用多個JVM啟動參數,則傳入多個 -Jxxxxxx.

**-stack false|true **

關閉對象配置設定調用棧跟蹤(tracking object allocation call stack)。 如果配置設定位置資訊在堆轉儲中不可用. 則必須将此标志設定為 false. 預設值為 true.

**-refs false|true **

關閉對象引用跟蹤(tracking of references to objects)。 預設值為 true. 預設情況下, 傳回的指針是指向其他特定對象的對象,如反向連結或輸入引用(referrers or incoming references), 會統計/計算堆中的所有對象。

**-port port-number **

設定 jhat HTTP server 的端口号. 預設值 7000。

**-exclude exclude-file **

指定對象查詢時需要排除的資料成員清單檔案(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果檔案列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象清單時, 引用路徑涉及 java.lang.String.value 的都會被排除。

**-baseline exclude-file **

指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被标記為不是新的(marked as not being new). 其他對象被标記為新的(new). 在比較兩個不同的堆轉儲時很有用。

**-debug int **

設定 debug 級别. 0 表示不輸出調試資訊。 值越大則表示輸出更詳細的 debug 資訊。

**-version **

啟動後隻顯示版本資訊就退出。

應用示例

#将記憶體使用的詳細情況輸出到dump.txt 檔案
jmap -dump:format=b,file=dump.txt <pid> 

#解析堆轉儲檔案
jhat -J-Xmx512m dump.txt
通路http://ip-server:7000檢視
           

7、jstack:Java堆棧跟蹤工具

jstack(Stack Trace for Java)指令用于生成虛拟機目前時刻的線程快照。

線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導緻的長時間等待等都是導緻線程長時間停頓的常見原因。

線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就可以知道沒有響應的線程到底在背景做些什麼事情,或者等待着什麼資源。

指令格式

jstack [ options ]

參數說明

[[email protected] ~]# jstack -h
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  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

           

-F 當’jstack [-l] pid’沒有響應的時候強制列印棧資訊

-m 列印java和native c/c++架構的所有棧資訊

-l 長清單. 列印關于鎖的附加資訊,例如屬于java.util.concurrent 的 ownable synchronizers清單.

-h | -help 列印幫助資訊

應用示例

jstack 檢視指定程序的線程資訊

[[email protected] ~]# jstack 20105
2019-03-01 17:59:20
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode):

"qtp605101809-69" #69 prio=5 os_prio=0 tid=0x00007fdcb45b4000 nid=0x3e26 waiting on condition [0x00007fdd5995a000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000003d4f3d870> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:389)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:531)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.access$700(QueuedThreadPool.java:47)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:590)
	at java.lang.Thread.run(Thread.java:748)

"Attach Listener" #67 daemon prio=9 os_prio=0 tid=0x00007fdd14001000 nid=0x5bad waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
-----------------------省略------------------------------