《深入理解 Java 虛擬機器》讀書筆記:虛擬機器效能監控與故障處理工具
正文
一、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 執行時間分析以及記憶體分析