JVM 常用命令列工具
阿新 • • 發佈:2021-01-04
> 本文部分摘自《深入理解 Java 虛擬機器第三版》
## 基礎故障處理工具 Java 開發人員肯定都知道 JDK 的 bin 目錄下有許多小工具,這些小工具除了用於編譯和執行 Java 程式外,打包、部署、簽名、除錯、監控、運維等各種場景都可能會見到它們的影子 本文主要介紹的是用於監視虛擬機器執行狀態和進行故障處理的工具,根據軟體可用性和授權的不同,可以分成三類: - 商業授權工具:主要是 JMC(Java Mission Control)及它要使用到的 JFR(Java Flight Recorder)。JMC 在個人開發環境中使用是免費的,但在商業環境中使用則需付費 - 正式支援工具:這一類工具屬於長期被支援的工具 - 實驗性工具:這一類工具帶有實驗性質,日後可能會轉正,也可能會在某個 JDK 版本中無聲無息地消失
## Java 記憶體對映工具 jmap(Memory Map for Java)命令用於生成堆轉儲快照,還可以查詢 finalize 執行佇列、Java 堆和方法區的詳細資訊,如空間使用率、當前用的是哪種收集器等 `````` jmap [option] vmid `````` option 選項的合法值與具體含義 | 選項 | 作用 | | :------------: | :----------------------------------------------------------: | | -dump | 生成 Java 堆轉儲快照,格式為 -dump:[live,]format=b,file=\
## 虛擬機器堆轉儲快照分析工具 JDK 提供 jhat(JVM Heap Analysis Tool)命令和 jmap 搭配使用,用來分析 jmap 生成的堆轉儲快照。不過 jhat 的分析功能相等簡陋,一般會使用其他功能更強大的分析工具 jhat 內建一個簡單的 web 伺服器,此命令執行後,jhat 在命令列裡顯示分析結果的訪問地址,可以用 -port 選項指定埠 有時 dump 出來的堆很大,在啟動時會報堆空間不足的錯誤,可以使用如下引數 `````` jhat -J-Xmx512m
## Java 堆疊跟蹤工具 jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為 threaddump 或 javacore 檔案)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的目的通常是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間掛起等 `````` jstack [option] vmid `````` option 選項的合法值與具體含義如表 | 選項 | 作用 | | :--: | :-------------------------------------------: | | -F | 當正常輸出的請求不被響應時,強制輸出執行緒堆疊 | | -l | 除堆疊外,顯示關於鎖的附加資訊 | | -m | 如果呼叫到本地方法的話,可以顯示 C/C++ 的堆疊 | 從 JDK5 開始,java.lang.Thread 類新增了一個 getAllStackTraces() 方法用於獲取虛擬機器中所有執行緒的 StackTraceElement 物件,使用這個方法可以完成 jstack 的大部分功能,在實際專案中可以呼叫這個方法做一個管理員頁面,隨時使用瀏覽器來查閱執行緒堆