1. 程式人生 > >第四章 虛擬機器效能監控與故障處理工具

第四章 虛擬機器效能監控與故障處理工具

4.1 JDK的命令列工具

      用於監視虛擬機器和故障處理的工具,它們的功能程式碼是在tools類庫中實現的。藉助tools.jar類庫裡面的介面,我們可以直接在應用程式中實現功能強大的監控分析功能。

4.1.1 jps:虛擬機器程序狀況工具

      可以列出正在執行的虛擬機器程序,並顯示虛擬機器執行主類的名稱,以及這些程序的本地虛擬機器的唯一ID。雖然功能比較單一,但它是使用頻率最高的JDK命令列工具,因為其他的JDK工具大多需要輸入它查詢到的LVMID來確定要監控的是哪一個虛擬機器程序。對於本地虛擬機器程序來說,LVMID與作業系統的程序ID是一致的,使用Windows是工作管理員或Unix的ps命令也可以查詢到虛擬機器程序的LVMID,但如果同時啟動了多個虛擬機器程序,無法根據程序名稱定位時,那就只能依賴jps命令顯示主類的功能才能區分了。

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

      jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機器各種執行狀態資訊的命令列工具。它可以顯示本地或遠端虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料,在沒有GUI圖形介面,只提供了純文字控制檯環境的伺服器上,它將是執行期定位虛擬機器效能問題的首選工具。

4.1.3 jinfo:java配置資訊工具

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

4.1.4 jmap:java記憶體影像工具

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

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

      Sun JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在瀏覽器中檢視。實際使用中的不足之處:一是一般不會在部署應用程式的伺服器上直接分析dump檔案,即使可以這樣做,也會盡量將dump檔案拷貝到其他機器上進行分析,因為分析工作是一個耗時而且消耗硬體資源的過程,既然要在其他機器上進行,就沒必要收到命令列工具的限制了。另一個原因是jhat的分析功能相對來說比較簡陋。

4.1.6 jstack:java堆疊跟蹤工具

      jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump或Javacore檔案)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因。執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做什麼事情,或者等待著什麼資源。

4.2 JDK的視覺化工具

      JDK中除了提供大量的命令列工具外,還有兩個功能強大的視覺化工具:JConsole和VisualVM,這兩個工具是JDK的正式成員,沒有被貼上“unsupported and experimental”的標籤。