第四章 性能監控與故障處理工具 4.1 JDK指令行工具
- jps (JVM Process Status Tool):虛拟機程序狀況工具,可列出正在運作的虛拟機程序,并顯示虛拟機主類(Main Class,main()函數所在的類)的名稱,以及這些程序的本地虛拟機的唯一ID(LVMID,Local Virtual Machine Identifier),對于本地虛拟機程序來說,LVMID與作業系統的程序ID(PID, Process Identifier)一緻。jps可通過RMI協定查詢開啟了RMI服務的遠端虛拟機程序狀态,hostid為RMI系統資料庫中注冊的主機名。
jps指令格式為:jps [options] [hostid]
常用選項如下表:
- jstat(JVM Statistics Monitoring Tool):虛拟機統計資訊監視工具,用于監視虛拟機各種運作狀态資訊,可以顯示本地或遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,它是在沒有GUI圖形界面的伺服器上運作期定位虛拟機性能問題的首選工具。
jstat指令行格式:jstat [ option vmid [ interval [s | ms ] [ count ] ] ]
常用選項如下表:
說明:指令行中VMID與LVMID在本地虛拟機程序中是一緻的,若為遠端虛拟機,則VMID的格式為:[protocol]:[//]vmid[@hostname][:port]/[servername],參數 interval和count代表查詢間隔和次數,若省略,則查詢一次,如每250ms查詢一次程序2764垃圾收集情況,共查詢20次,指令為:jstat -gc 2764 250 20
- jinfo(Configuration Info for Java):Java配置資訊工具,用于實時地檢視和調整虛拟機的各項參數。jinfo的Option參數有:-flags(顯示參數的系統預設值)、-sysprops(列印虛拟機程序的System.getProperties()的内容)。
jinfo指令格式為:jinfo [ option ] pid
- jmap(Memory Map for Java):Java記憶體映像工具,用于生成堆轉儲快照(一般稱為heapdump或dump檔案),也可使用-XX:+HeapDumpOnOutOfMemoryError參數在虛拟機出現OOM異常後自動生成dump檔案,通過-XX:+HeapDumpOnCtrlBreak參數則可使用Ctrl+Break鍵讓虛拟機生成dump檔案。另外,jmap還可查詢finalize執行隊列、Java堆和永久代的詳細資訊,如空間使用率、目前使用的收集器類型等。
jmap指令格式為:jmap [ option ] vmid
option選項的值如下表:
- jhat(JVM Heap Analysis Tool):虛拟機堆轉儲快照分析工具, 用于與jmap指令搭配來分析jmap生成的堆轉儲快照。jhat内置一個微型的HTTP/HTML伺服器,生成dump檔案後可用浏覽器檢視。如jhat test.bin,其中test.bin是用jmap指令生成的dump檔案。
- jstack(Stack Trace for Java):Java堆棧跟蹤工具,用于生成虛拟機目前時刻的線程快照(一般稱為threaddump或javacore檔案),其目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環等。
jstack指令格式為:jstack [ option ] vmid
option選項的值如下表:
4.2 JDK的可視化工具
- JConsole(Java Monitoring and Management Console):Java監視與管理控制台,是一款基于JMX的可視化監視和管理工具。
1 ) 啟動JConsole:通過JDK/bin目錄下的"jconsole.exe"啟動,啟動後将自動搜尋出本機運作的所有虛拟機程序; 2 ) 記憶體監控:"記憶體"标簽相當于jstat指令,用于監視收集器管理的虛拟機記憶體(Java堆和永久代)的變化趨勢,如下執行個體代碼用于體驗其監視功能:
/**
* VM參數: -verbose:gc - Xms100M -Xmx100M
* -XX:+UseSerialGC
*/
public class Test{
public static void main(String[] args) throws Throwable {
fillHeap(10000);
}
static class OOMObject{
public byte [] object = new byte [1024];
}
public static void fillHeap (int num) throws Exception{
List<OOMObject> list = new ArrayList<OOMObject>(num);
for(int i = 0; i < num; i++){
// 稍作延遲,使監視曲線變化更明顯
Thread. sleep(50);
list.add( new OOMObject());
}
System. gc();
}
}
3 ) 線程監控:相當于可視化的jstack指令,遇到線程停頓時可使用它進行監控分析;
- VisualVM(All-in-one Java Troubleshooting Tool):多合一故障處理器,提供運作監視、故障處理、性能分析,它不需要被監視的程式基于特殊的Agent運作,對應用程式的實際性能影響很小,使得它可以直接應用在生産環境中。
核心内容出處:《深入了解Java虛拟機:JVM進階特性與最佳實踐》