JVM 經常使用命令行工具


本文部分摘自《深刻理解 Java 虛擬機第三版》java


基礎故障處理工具

Java 開發人員確定都知道 JDK 的 bin 目錄下有許多小工具,這些小工具除了用於編譯和運行 Java 程序外,打包、部署、簽名、調試、監控、運維等各類場景均可能會見到它們的影子web

本文主要介紹的是用於監視虛擬機運行狀態和進行故障處理的工具,根據軟件可用性和受權的不一樣,能夠分紅三類:瀏覽器

  • 商業受權工具:主要是 JMC(Java Mission Control)及它要使用到的 JFR(Java Flight Recorder)。JMC 在我的開發環境中使用是免費的,但在商業環境中使用則需付費
  • 正式支持工具:這一類工具屬於長期被支持的工具
  • 實驗性工具:這一類工具帶有實驗性質,往後可能會轉正,也可能會在某個 JDK 版本中無聲無息地消失

虛擬機進程情況工具

使用 jps(JVM Process Status Tool)能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(main 函數所在的類)名稱以及這些進程的本地虛擬機惟一 ID(LVMID,Local Virtual Machine Identifier)服務器

該命令能夠獲取虛擬機進程的 LVMID,從而定位想要監控的程序,而 LVMID 通常與操做系統的進程 ID 一致運維

jps [options] [hostid]

jps 也能夠經過 RMI 協議查詢開啓了 RMI 服務的遠程 Java 虛擬機進程狀態,參數 hostid 爲 RMI 註冊表中註冊的主機名函數

jps 的其餘經常使用選項如表:工具

選項 做用
-q 只輸出 LVMID,省略主類的名稱
-m 輸出虛擬機進程啓動時傳遞給主類 main() 函數的參數
-l 輸出主類的全名,若是進程執行的是 JAR 包,則輸出
-v 輸出虛擬機進程啓動時的 JVM 參數

虛擬機統計信息監視工具

jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各類運行狀態信息的命令行工具,能夠顯示本地或者遠程虛擬機進程中的類加載、內存、垃圾收集、即時編譯等運行時數據操作系統

jstat [ option vmid [interval[s|ms] [count]] ]

若是是本地虛擬機進程,VMID 與 LVMID 是一致的;若是是遠程虛擬機進程,那 VMID 的格式應當是命令行

[protocaol:][//]lvmid[@hostname[:port]/servername]

參數 interval 和 count 表明查詢間隔和次數,若是省略這兩個參數,說明只查詢一次。假設須要每 250 毫秒查詢一次進程 2764 的垃圾收集狀況,一共查詢 20 次,那命令應當是線程

jstat -gc 2764 250 20

選項 option 表明用戶但願查詢的虛擬機信息,主要分三類:類加載、垃圾收集、運行期編譯情況等

選項 做用
-class 監視類加載、卸載數量、總空間以及類裝載所耗費的時間
-gc 監視 Java 堆情況,包括 Eden 區、兩個 Survivor 區、老年代、永久代等的容量、已用空間、垃圾收集時間合計等信息
-gccapacity 監視內容與 -gc 基本相同,但輸出主要關注 Java 堆各個區域使用到的最大、最小空間
-gcutil 監視內容與 -gc 基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與 -gcutil 功能同樣,但會額外輸出致使上一次垃圾收集產生的緣由
-gcnew 監視新生代垃圾收集狀況
-gcnewcapacity 監視內容與 -gcnew 基本相同,但輸出主要關注使用到的最大、最小空間
-gcold 監視老年代垃圾收集狀況
-gcoldcapacity 監視內容與 -gcold 基本相同,但輸出主要關注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出即時編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已經被即時編譯的方法

Java 配置信息工具

jinfo(Configuration Info for Java)的做用是實時查看和調整虛擬機各項參數,使用 jps 命令的 -v 參數能夠查看虛擬機啓動時顯示指定的參數列表,獲取 pid

jinfo [option] pid

使用 -flag <name> 選項打印虛擬機標記參數的值,name 表示虛擬機標記參數的名稱

jinfo -flag PrintGC 21768

使用 -flag [+|-]<name> 選項能夠開啓或關閉虛擬機表示參數,+ 表示開啓,- 表示關閉

jinfo -flag +PrintGC 21768
jinfo -flag -PrintGC 21768

使用 -flag <name> = <value> 能夠設置虛擬機標記參數的值,但並非每一個參數均可以被動態修改

jinfo -flag HeapDumpPath=C:\error.hprof 21768

剩下的經常使用選項如表

選項 做用
-flags 打印虛擬機參數,如 -XX:NewSize
no option 不帶任何選項時,會同時打印虛擬機參數和系統參數
-sysprops 打印系統參數
-h | -help 打印幫助信息

Java 內存映射工具

jmap(Memory Map for Java)命令用於生成堆轉儲快照,還能夠查詢 finalize 執行隊列、Java 堆和方法區的詳細信息,如空間使用率、當前用的是哪一種收集器等

jmap [option] vmid

option 選項的合法值與具體含義

選項 做用
-dump 生成 Java 堆轉儲快照,格式爲 -dump:[live,]format=b,file=<filename>,其中 live 子參數說明是否只 dump 出存活的對象
-finalizerinfo 顯示在 F-Queue 中等待 Finalizer 線程執行 finalize 方法的對象
-heap 顯示 Java 堆詳細信息,如使用哪一種回收期、參數配置、分代情況
-histo 顯示堆中對象統計信息,包括類、實例數量、合計容量
-permstat 以 ClassLoader 爲統計口徑顯示永久代內存狀態
-F 當虛擬機進程對 -dump 選項沒有響應時,可以使用該選項強制生成 dump 快照

虛擬機堆轉儲快照分析工具

JDK 提供 jhat(JVM Heap Analysis Tool)命令和 jmap 搭配使用,用來分析 jmap 生成的堆轉儲快照。不過 jhat 的分析功能相等簡陋,通常會使用其餘功能更強大的分析工具

jhat 內置一個簡單的 web 服務器,此命令執行後,jhat 在命令行裏顯示分析結果的訪問地址,能夠用 -port 選項指定端口

有時 dump 出來的堆很大,在啓動時會報堆空間不足的錯誤,能夠使用以下參數

jhat -J-Xmx512m <heap dump file>	# 這個內存大小可根據本身電腦進行設置

Java 堆棧跟蹤工具

jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(通常稱爲 threaddump 或 javacore 文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的目的一般是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間掛起等

jstack [option] vmid

option 選項的合法值與具體含義如表

選項 做用
-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-l 除堆棧外,顯示關於鎖的附加信息
-m 若是調用到本地方法的話,能夠顯示 C/C++ 的堆棧

從 JDK5 開始,java.lang.Thread 類新增了一個 getAllStackTraces() 方法用於獲取虛擬機中全部線程的 StackTraceElement 對象,使用這個方法能夠完成 jstack 的大部分功能,在實際項目中能夠調用這個方法作一個管理員頁面,隨時使用瀏覽器來查閱線程堆棧

相關文章
相關標籤/搜索