《深入理解 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 執行時間分析以及內存分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM