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 做用:
列出正在運行的虛擬機進程,並顯示虛擬機進程執行主類(main() 函數所在的類)名稱以及進程的本地虛擬機惟一 ID(Local Virtual Machine Identifier,LVMID)。對於本地虛擬機進程,LVMID 與操做系統進程 ID(PID)一致。apache
jps 命令格式:瀏覽器
jps [options] [hostid]
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 做用:
用於監視虛擬機各類運行狀態信息。能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT 編譯等運行數據。性能
jstat 命令格式:測試
jstat <option> <vmid> [interval[s|ms] [count]]
[protocol:][//]lvmid[@hostname][:port]/servername
。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 做用:
實時地查看和調整虛擬機各項參數。
jinfo 命令格式:
jinfo [option] <pid>
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 做用:
主要用於生成堆轉儲快照(通常稱爲 heapdump 或 dump 文件)。除此以外,還能夠查詢 finalize 執行隊列、Java 堆和永久代的詳細信息。
jmap 命令格式:
jmap [option] <vmid>
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 做用:
用於分析 jmap 生成的堆轉儲快照。jhat 內置了一個微型的 HTTP/HTML 服務器,生成 dump 文件分析結果後,可在瀏覽器中查看。
jhat 命令格式:
jhat [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 做用:
用於生成虛擬機當前時刻的線程快照(通常稱爲 threaddump 或 javacore 文件)。線程快照是當前虛擬機內每一條線程正在執行的方法堆棧的集合。
生成線程快照的主要目的是定位線程出現長時間停頓的緣由。當線程出現停頓時,經過 jstack 查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作些什麼事情,或者等待着什麼資源。
jstack 命令格式:
jstack [option] <vmid>
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 提供了兩個功能強大的可視化工具:JConsole 和 VisualVM。
經過 JDK/bin 目錄下的「jconsole.exe」啓動 JConsole 後,將自動搜索出本機運行的全部虛擬機進程,不須要用戶本身使用 jps 查詢。雙擊選擇其中一個進程便可開始監控,也可以使用「遠程進程」功能來鏈接遠程服務器,對虛擬機進行監控。
「概述」頁籤顯示的是整個虛擬機主要運行數據的概覽。
「內存」頁籤至關於可視化的 jstat 命令,用於監視受收集器管理的虛擬機內存的變化趨勢。
「線程」頁籤至關於可視化的 jstack 命令,遇到線程停頓時可以使用該頁籤進行監控分析。
VisualVM 除了默認提供的監視、線程等功能外,還能夠安裝擴展插件來集成更多功能。
經過 JDK/bin 目錄下的「jvisualvm.exe」啓動 VisualVM 後,選擇一個須要監視的程序便可進入主界面。
「概述」頁籤用於顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo)。
「監視」頁籤和「線程」頁籤,用於監視應用程序的 CPU、內存、類以及線程的信息(jstat、jstack)。
在 VisualVM 中生成 dump 文件有兩種方式:
右鍵單擊應用程序節點,選擇「堆 Dump」。
在「監視」頁籤中單擊「堆 Dump」。
生成 dump 文件後,將在應用程序下增長一個以 [heapdump] 開頭的子節點,而且在主頁籤中打開該轉儲快照。若是須要保存 dump 文件,要在 heapdump 節點上右鍵選擇「另存爲」。不然當 VisualVM 關閉時,生成的 dump 文件也會被刪除掉。
「Profiler」頁籤中,VisualVM 提供了程序運行期間方法級的 CPU 執行時間分析以及內存分析。