《深刻理解 Java 虛擬機》讀書筆記:虛擬機性能監控與故障處理工具

正文

1、JDK 的命令行工具

JDK 的 bin 目錄下提供了一些用於監視虛擬機和故障處理的命令行工具。java

名稱 主要做用
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,顯示虛擬機的快照進程

一、jps:虛擬機進程情況工具

jps 做用:
列出正在運行的虛擬機進程,並顯示虛擬機進程執行主類(main() 函數所在的類)名稱以及進程的本地虛擬機惟一 ID(Local Virtual Machine Identifier,LVMID)。對於本地虛擬機進程,LVMID 與操做系統進程 ID(PID)一致。apache

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: 也不知道是否是個人打開方式不對,在 Win七、Win10 下用 JDK1.六、1.七、1.8 測試時,輸出的是 Jar 文件名,而不是 Jar 路徑。工具

二、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 編譯的方法

三、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() 的內容
顯示全部虛擬機參數及系統變量

四、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 快照

五、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 便可查看分析結果。

六、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++ 的堆棧

2、JDK的可視化工具

JDK 提供了兩個功能強大的可視化工具:JConsole 和 VisualVM。

一、JConsole:Java 監視與管理控制檯

(1)啓動 JConsole

經過 JDK/bin 目錄下的「jconsole.exe」啓動 JConsole 後,將自動搜索出本機運行的全部虛擬機進程,不須要用戶本身使用 jps 查詢。雙擊選擇其中一個進程便可開始監控,也可以使用「遠程進程」功能來鏈接遠程服務器,對虛擬機進行監控。

「概述」頁籤顯示的是整個虛擬機主要運行數據的概覽。

(2)內存監控

「內存」頁籤至關於可視化的 jstat 命令,用於監視受收集器管理的虛擬機內存的變化趨勢。

(3)線程監控

「線程」頁籤至關於可視化的 jstack 命令,遇到線程停頓時可以使用該頁籤進行監控分析。

二、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 執行時間分析以及內存分析。

相關文章
相關標籤/搜索