正文
一、JDK 的命令行工具
JDK 的 bin 目錄下提供了一些用於監視虛擬機和故障處理的命令行工具。
名稱 | 主要作用 |
---|---|
jps | JVM Process Status Tool,顯示正在運行的虛擬機進程 |
jstat | JVM Statistics Monitoring Tool,收集虛擬機各方面的運行數據 |
jinfo | Configuration Info for Java,顯示虛擬機配置信息 |
jmap | Memory Map for Java,生成虛擬機的內存轉儲快照(heapdump 文件) |
jhat | JVM Heap Dump Browser,用於分析 heapdump 文件,它會建立一個 HTTP/HTML 服務器,可在瀏覽器上查看分析結果 |
jstack | Stack Trace for Java,顯示虛擬機的快照進程 |
1、jps:虛擬機進程狀況工具
jps 作用:
列出正在運行的虛擬機進程,並顯示虛擬機進程執行主類(main() 函數所在的類)名稱以及進程的本地虛擬機唯一 ID(Local Virtual Machine Identifier,LVMID)。對於本地虛擬機進程,LVMID 與操作系統進程 ID(PID)一致。
jps 命令格式:
jps [options] [hostid]
- options:選項,可多個。
- hostid:jps 可以通過 RMI 協議查詢開啟了 RMI 服務的遠程虛擬機進程狀態,hostid 為 RMI 注冊表中注冊的主機名。
jps 執行樣例:
root@█████████:~# jps -l
16657 halo-latest.jar
20498 org.apache.catalina.startup.Bootstrap
16669 sun.tools.jps.Jps
jps 選項:
選項 | 作用 |
---|---|
-q | 只輸出 LVMID,省略主類的名稱 |
-m | 輸出虛擬機進程啟動時,傳遞給主類 main() 函數的參數 |
-l | 輸出主類的全名,如果進程執行的是 Jar 包,輸出 Jar 路徑 |
-v | 輸出虛擬機進程啟動時 JVM 參數 |
PS: 也不知道是不是我的打開方式不對,在 Win7、Win10 下用 JDK1.6、1.7、1.8 測試時,輸出的是 Jar 文件名,而不是 Jar 路徑。
2、jstat:虛擬機統計信息監視工具
jstat 作用:
用於監視虛擬機各種運行狀態信息。可以顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT 編譯等運行數據。
jstat 命令格式:
jstat <option> <vmid> [interval[s|ms] [count]]
- option:選項,代表用戶希望查詢的虛擬機信息,主要分為 3 類:類裝載、垃圾收集、運行期編譯狀況。
- vmid:虛擬機唯一 ID(VMID),如果是本地虛擬機進程,那么 VMID 與 LVMID 一致,如果是遠程虛擬機進程,那么 VMID 的格式為:
[protocol:][//]lvmid[@hostname][:port]/servername
。 - interval:查詢間隔。
- count:查詢次數。同時省略 interval 和 count 時,表示只查詢一次。
jstat 執行樣例:
root@█████████:~# jstat -gcutil 20498
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
14.14 0.00 91.33 96.52 96.90 93.32 1210 7.328 6 0.536 7.864
jstat 選項:
選項 | 作用 |
---|---|
-class | 顯示類裝載、卸載數量、總空間以及類裝載所耗費的時間 |
-gc | 顯示 Java 堆狀況,包括各個區域的容量、已用空間、GC 時間合計等 |
-gccapacity | 顯示 Java 堆各個區域的最大、最小(初始化)容量 |
-gcutil | 顯示 Java 堆各個區域的已使用空間占總空間的百分比 |
-gccause | 與 -gcutil 功能一樣,但會額外輸出導致上一次 GC 產生的原因 |
-gcnew | 顯示新生代 GC 狀況 |
-gcnewcapacity | 顯示新生代最大、最小(初始化)容量 |
-gcold | 顯示老年代 GC 狀況 |
-gcoldcapacity | 顯示老年代最大、最小(初始化)容量 |
-gcpermcapacity | 顯示永久代最大、最小(初始化)容量 |
-compiler | 顯示 JIT 編譯器編譯過的方法、耗時等信息 |
-printcompilation | 顯示已被 JIT 編譯的方法 |
3、jinfo:Java 配置信息工具
jinfo 作用:
實時地查看和調整虛擬機各項參數。
jinfo 命令格式:
jinfo [option] <pid>
- option:選項。
- pid:虛擬機進程 ID。
jinfo 執行樣例:
root@█████████:~# jinfo -flag MaxHeapSize 20498
-XX:MaxHeapSize=260046848
jinfo 選項:
選項 | 作用 |
---|---|
-flag <name> | 顯示指定 name 的虛擬機參數 |
-flag [+|-]<name> | 啟用或禁用指定 name 的虛擬機參數 |
-flag <name>=<value> | 設置指定 name 的虛擬機參數值 |
-flags | 顯示所有的虛擬機參數 |
-sysprops | 顯示虛擬機進程的系統變量,即 System.getProperties() 的內容 |
無 | 顯示所有虛擬機參數及系統變量 |
4、jmap:Java 內存映像工具
jmap 作用:
主要用於生成堆轉儲快照(一般稱為 heapdump 或 dump 文件)。除此之外,還可以查詢 finalize 執行隊列、Java 堆和永久代的詳細信息。
jmap 命令格式:
jmap [option] <vmid>
- option:選項。
- vmid:虛擬機進程唯一 ID。
jmap 執行樣例:
root@█████████:~# jmap -dump:format=b,file=test.bin 20498
Dumping heap to /root/test.bin ...
Heap dump file created
jmap 選項:
選項 | 作用 |
---|---|
-dump | 生成 Java 堆轉儲快照。格式為:-dump:[live,]format=b,file=<filename>,live 子參數表示是否只 dump 出存活的對象 |
-finalizerinfo | 顯示在 F-Queue 中等待 Finalizer 線程執行 finalize 方法的對象 |
-heap | 顯示 Java 堆詳細信息,如使用哪種回收器、參數配置、分代狀況等 |
-histo | 顯示堆中對象統計信息,包括類、實例數量、合計容量 |
-permstat | 以 ClassLoader 為統計口徑顯示永久代內存狀況,JDK1.8 改為 -clstats |
-F | 當虛擬機進程對 -dump 選項沒有響應時,可使用該選項強制生成 dump 快照 |
5、jhat:虛擬機堆轉儲快照分析工具
jhat 作用:
用於分析 jmap 生成的堆轉儲快照。jhat 內置了一個微型的 HTTP/HTML 服務器,生成 dump 文件分析結果后,可在瀏覽器中查看。
jhat 命令格式:
jhat [option] <file>
- option:選項。
- file:堆轉儲快照文件。
jhat 執行樣例:
root@█████████:~# jhat test.bin
Reading from test.bin...
Dump file created Tue Dec 17 21:49:26 CST 2019
Snapshot read, resolving...
Resolving 979375 objects...
Chasing references, expect 195 dots...................................................................................................................................................................................................
Eliminating duplicate references...................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
在瀏覽器中輸入 http://IP地址:7000 即可查看分析結果。
6、jstack:Java 堆棧跟蹤工具
jstack 作用:
用於生成虛擬機當前時刻的線程快照(一般稱為 threaddump 或 javacore 文件)。線程快照是當前虛擬機內每一條線程正在執行的方法堆棧的集合。
生成線程快照的主要目的是定位線程出現長時間停頓的原因。當線程出現停頓時,通過 jstack 查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后台做些什么事情,或者等待着什么資源。
jstack 命令格式:
jstack [option] <vmid>
- option:選項。
- vmid:虛擬機進程唯一 ID。
jstack 執行樣例(部分結果):
root@█████████:~# jstack -l 20498
2019-12-17 22:08:31
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.141-b15 mixed mode):
"Attach Listener" #7966 daemon prio=9 os_prio=0 tid=0x00007f0a54037800 nid=0xf15 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
...
jstack 選項:
選項 | 作用 |
---|---|
-F | 當正常輸出的請求不被響應時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關於鎖的附加信息 |
-m | 如果調用到本地方法的話,可以顯示 C/C++ 的堆棧 |
二、JDK的可視化工具
JDK 提供了兩個功能強大的可視化工具:JConsole 和 VisualVM。
1、JConsole:Java 監視與管理控制台
(1)啟動 JConsole
通過 JDK/bin 目錄下的“jconsole.exe”啟動 JConsole 后,將自動搜索出本機運行的所有虛擬機進程,不需要用戶自己使用 jps 查詢。雙擊選擇其中一個進程即可開始監控,也可使用“遠程進程”功能來連接遠程服務器,對虛擬機進行監控。
“概述”頁簽顯示的是整個虛擬機主要運行數據的概覽。
(2)內存監控
“內存”頁簽相當於可視化的 jstat 命令,用於監視受收集器管理的虛擬機內存的變化趨勢。
(3)線程監控
“線程”頁簽相當於可視化的 jstack 命令,遇到線程停頓時可使用該頁簽進行監控分析。
2、VisualVM:多合一故障處理工具
VisualVM 除了默認提供的監視、線程等功能外,還可以安裝擴展插件來集成更多功能。
(1)啟動 VisualVM
通過 JDK/bin 目錄下的“jvisualvm.exe”啟動 VisualVM 后,選擇一個需要監視的程序即可進入主界面。
“概述”頁簽用於顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo)。
(2)運行監視
“監視”頁簽和“線程”頁簽,用於監視應用程序的 CPU、內存、類以及線程的信息(jstat、jstack)。
(3)生成、瀏覽堆轉儲快照
在 VisualVM 中生成 dump 文件有兩種方式:
-
右鍵單擊應用程序節點,選擇“堆 Dump”。
-
在“監視”頁簽中單擊“堆 Dump”。
生成 dump 文件后,將在應用程序下增加一個以 [heapdump] 開頭的子節點,並且在主頁簽中打開該轉儲快照。如果需要保存 dump 文件,要在 heapdump 節點上右鍵選擇“另存為”。否則當 VisualVM 關閉時,生成的 dump 文件也會被刪除掉。
(4)分析程序性能
“Profiler”頁簽中,VisualVM 提供了程序運行期間方法級的 CPU 執行時間分析以及內存分析。