天天看點

JVM之性能監控與故障處理工具

                                               第四章   性能監控與故障處理工具 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]

          常用選項如下表:

JVM之性能監控與故障處理工具
  • jstat(JVM Statistics Monitoring Tool):虛拟機統計資訊監視工具,用于監視虛拟機各種運作狀态資訊,可以顯示本地或遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,它是在沒有GUI圖形界面的伺服器上運作期定位虛拟機性能問題的首選工具。

                 jstat指令行格式:jstat [ option vmid [ interval [s | ms ] [ count ] ] ] 

         常用選項如下表:

JVM之性能監控與故障處理工具

          說明:指令行中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選項的值如下表:

JVM之性能監控與故障處理工具
  • 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選項的值如下表:

JVM之性能監控與故障處理工具

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進階特性與最佳實踐》