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秒輸出一次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 -dump
或jmap -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 parsing2
: 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
- 直接運行
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
沒有足夠的權限所致- 新建一個
jstatd.all.policy
文件, 加入以下內容
grant codebase "path/to/tools.jar" { permission java.security.Allpermission; };
- 然后使用以下命令開啟
jstatd
服務器, 默認情況下jstatd
將會在1099
端口開啟RMI服務
jstatd -J-Djava.security.policy=path/to/jstatd.all.policy
- 使用
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