深入理解JVM(③)虛擬機器效能監控、故障處理工具

紀莫發表於2020-06-22

前言

JDK的bin目錄中有一系列的小工具,除了java.exe、javac.exe這兩個編譯和執行Java程式外,還有打包、部署、簽名、除錯、監控、運維等各種場景都會用到這些小工具。

這些工具根據軟體可用性和授權的不同,可以把它們劃分為三類:

  • 商業授權工具: 主要是JMC(Java Mission Control)及它要使用到的JFR(Java Flight Recorder),JMC在個人開發環境中使用是免費的,但是在商業環境中使用它則是付費的。
  • 正式支援工具: 這一類工具屬於被長期支援的工具,不同平臺、不同版本的JDK之間,這類工具可能會略有差異,但是不會出現某一個工具突然消失的情況。
  • 實驗性工具: 這一類工具在它們的使用說明中被宣告為“沒有技術支援,並且是實驗性質的”(Unsupported and Experimental)產品,日後可能會轉載,也可能會在某個JDK版本中國無聲無息地消失。

jps:虛擬機器程式狀態工具

JDK的一些小工具都參考了UNIX的命名方式,jps(JVM Process Status Tool)是其中的典型。
功能也是和UNIX的ps的命令類似:
可以列出正在執行的虛擬機器程式,並顯示虛擬機器執行主類(Main Class,main()函式所在的類)名稱以及這些程式的本地虛擬機器唯一ID(LVMID,Local Virtual Machine Identifier)。
jps命令格式:

jps [ options ]  [ hostid ]

jps工具主要選項:
在這裡插入圖片描述

jstat:虛擬機器統計資訊監視工具

jstat( JVM Statistics Monitoring Tool )是使用者監視虛擬機器各種執行狀態資訊的命令列工具。可以顯示本地虛擬機器程式中 類載入、記憶體、垃圾收集、即時編譯等執行時資料,這個命令是在伺服器是哪個執行期定位虛擬機器效能問題的常用工具。
jstat 命令格式為:

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

引數interval 和 count 代表查詢間隔和次數,如果省略這2個引數,說明只查詢一次假設需要每250毫秒查詢一次程式 1440 垃圾收集狀況,一共查詢20次,那命令應當是:

jstat -gc 1440 250 20 

option 代表使用者希望查詢的虛擬機器資訊,主要分三類:
類載入、垃圾收集、執行期間編譯狀況。
jstat工具主要選項
jstat主要選項

jinfo:Java配置資訊工具

jinfo(Configuration Info for Java)的作用是實時檢視和調整虛擬機器各項引數。使用jps命令的-v引數可以檢視虛擬機器啟動時顯示指定的引數列表,但如果想知道未被顯示指定的引數的系統預設值,除了去找資料外,就只能使用jinfo的-flag選項進行查詢了。jinfo還可以使用-sysprops選項把虛擬機器程式的

System.getProperties()

的內容打出來。
jinfo 命令格式:

jinfo [ option ] pid

jmap:Java記憶體映像工具

jmap (Memory Map for Java)命令用於生成堆轉儲快照(一般稱為heapdump 或 dump檔案)。
jmap的作用並不僅僅是為了獲取堆轉儲快照,它還可以查詢finalize執行佇列、Java堆和方法區的詳細資訊,如空間使用率、當前用的是哪種收集器等。
jmap 命令格式:

jmap [ option ] vmid

jmap工具主要選項
jmap工具主要選項

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

JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat內建了一個微型的HTTP/Web伺服器,生成堆轉儲快照的分析結果後,可以在瀏覽器中檢視。但是一般在實際工作中,都不會直接使用jhat命令來分析堆轉儲快照檔案,一是因為分析工作耗時而且極為耗費資源,一般不會直接在伺服器上使用,而是在其他機器上進行分析。二是jhat的分析功能比較簡陋,不如VisualVM,以及一些專業的分析工具例如:Eclipse Memory Analyzer、IBM HeapAnalyzer。

jstack:Java堆疊跟蹤工具

jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案)。
執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的目的通常是定位執行緒出現長時間停頓的原因,如執行緒死鎖、死迴圈、請求外部資源導致長時間掛起等,都是導致執行緒長時間停頓的常見原因。
jstack命令格式:

jstack [ option ] vmid 

執行緒出現停頓時通過jstack來檢視各個執行緒的呼叫堆疊,就可以獲知沒有響應的執行緒到底在後頭做些什麼事情,或者等待著什麼資源。
jstack工具主要選項
jstack工具主要選項

相關文章