六個命令行排查工具
我們一般使用 JDK 自帶的 6 個命令行工具來排查JVM。它們分別是:jps、jstat、jinfo、jmap、jhat 和 jstack,它們都位於 JDK 的 bin 目錄下,可以使用命令行工具直接運行。
jps(虛擬機進程狀況工具)
jps(JVM Process Status tool,虛擬機進程狀況工具),用於列出正在運行的 JVM 的 LVMID(Local Virtual Machine IDentifier,本地虛擬機唯一 ID),以及 JVM 的執行主類、JVM 啓動參數等信息。語法如下:
jps [options] [hostid]
常用的 options 選項:
-l:用於輸出運行主類的全名,如果是 jar 包,則輸出 jar 包的路徑;
-q:用於輸出 LVMID(Local Virtual Machine Identifier,虛擬機唯一 ID);
-m:用於輸出虛擬機啓動時傳遞給主類 main() 方法的參數;
-v:用於輸出啓動時的 JVM 參數。
jstat(虛擬機統計信息監視工具)
jstat(JVM Statistics Monitoring Tool,虛擬機統計信息監視工具)用於監控虛擬機的運行狀態信息。
查詢後的參數說明:
參數 | 說明 |
---|---|
S0C | 年輕代中第一個存活區的大小 |
S1C | 年輕代中第二個存活區的大小 |
S0U | 年輕代中第一個存活區已使用的空間(字節) |
S1U | 年輕代中第二個存活區已使用的空間(字節) |
EC | Edem 區大小 |
EU | 年輕代中 Edem 區已使用的空間(字節) |
OC | 老年代大小 |
OU | 老年代已使用的空間(字節) |
YGC | 從應用程序啓動到採樣時 young gc 的次數 |
YGCT | 從應用程序啓動到採樣時 young gc 的所用的時間(s) |
FGC | 從應用程序啓動到採樣時 full gc 的次數 |
FGCT | 從應用程序啓動到採樣時 full gc 的所用的時間 |
GCT | 從應用程序啓動到採樣時整個 gc 所用的時間 |
jstat 常用的查詢參數有:
-class,查詢類加載器信息;
-compiler,JIT 相關信息;
-gc,GC 堆狀態;
-gcnew,新生代統計信息;
-gcutil,GC 堆統計彙總信息。
jinfo(查詢虛擬機參數配置工具)
jinfo(Configuration Info for Java)用於查看和調整虛擬機各項參數。語法如下:
jinfo <option> <pid>
jmap(堆快照生成工具)
jmap(Memory Map for Java)用於查詢堆的快照信息。
jhat(堆快照分析功能)
jhat(JVM Heap Analysis Tool,堆快照分析工具)和 jmap 搭配使用,用於啓動一個 web 站點來分析 jmap 生成的快照文件。
jstack(查詢虛擬機當前的線程快照信息)
jstack(Stack Trace for Java)用於查看當前虛擬機的線程快照,用它可以排查線程的執行狀況,例如排查死鎖、死循環等問題。
兩個可視化排查工具
JConsole 和 JVisualVM 都位於 JDK 的 bin 目錄下,JConsole(Java Monitoring and Management Console)是最早期的視圖調試工具。
用 JConsole 可以監控線程、CPU、類、堆以及 VM 的相關信息,同樣我們可以通過線程這一頁的信息,發現之前我們故意寫的死鎖問題。
JVisualVM 既可以調試本地也可以調試遠程服務器
JVM 調優
JVM 調優主要是根據實際的硬件配置信息重新設置 JVM 參數來進行調優的。
JVM 常見調優參數包含以下這些:
-Xmx,設置最大堆內存大小;
-Xms,設置初始堆內存大小;
-XX:MaxNewSize,設置新生代的最大內存;
-XX:MaxTenuringThreshold,設置新生代對象經過一定的次數晉升到老生代;
-XX:PretrnureSizeThreshold,設置大對象的值,超過這個值的對象會直接進入老生代;
-XX:NewRatio,設置分代垃圾回收器新生代和老生代內存佔比;
-XX:SurvivorRatio,設置新生代 Eden、Form Survivor、To Survivor 佔比。