JVM性能監控與故障處理命令匯總(jps、jstat、jinfo、jmap、jhat、jstack)
給一個系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具才是運用知識處理數據的手段
使用適當的虛擬機監控和分析的工具可以加快我們分析數據、定位解決問題的速度,本文主要介紹了幾款服
務器上常用的命令行工具(jps、jstat、jinfo、jmap、jhat、jstack)
jps:虛擬機進程狀況工具
jps(JVM Process Status Tool)除了名字像UNIX的ps命令之外,它的功能也和ps命令類似,可以列出正在運行的虛擬機進程,並顯示虛擬機執行主類。
格式和常用參數如下:
jps[options][hostid]
-l 輸出主類名,如果進程是jar包,輸出包路徑
-v 輸出虛擬機啟動時的指定的JVM參數
-q 只輸出LVMID,省略主類名稱
示例:
jstat:虛擬機統計信息監視工具
jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各種運行狀態信息的命令行工具。它可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
格式如下:
jstat[option vmid[interval[s|ms][count]]]
-gc 監視Java堆狀況,包括Eden區、兩個survivor區、老年代、永久代等的容量、已用空間、GC時間合計信息
-class 監視類裝載、卸載數量、總空間以及類裝載所耗時間
-gcnew 監視新生代GC情況
-gcold 監視老年代GC情況
-compiler 輸出JIT編譯器編譯過的方法、耗時信息
-printcompilation 輸出已經被JIT編譯的方法
使用示例和解析:
如上圖,其中13495代表PID,250代表每隔250毫秒查詢一次垃圾收集狀況,20代表一共查詢20次。
打印出的內容中各列的含義我們可以通過man jstat命令查看:
jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是實時地查看和調整虛擬機各項參數。使用jps命令的-v參數可以查看虛擬機啟動時顯式指定的參數列表,但如果想知道未被顯式指定的參數的系統默認值,就要用到jinfo命令了。
格式如下:
jinfo[option]pid
-flag 輸出虛擬機啟動參數參數
-sysprops 把虛擬機進程的System.getProperties()的內容打印出來
示例如下:
jmap:Java內存影像工具
jmap(Memory Map for Java)命令一般用於生成堆轉儲快照(一般稱為heapdump或dump文件)。此命令用法較多,並不僅僅是為了獲取dump文件,它還可以查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前用的是哪種收集器等。
用法如下:
jmap[option]vmid
-dump 生成java的轉儲快照
-histo 顯示堆中對象的統計信息,包括類、實例數量、合計數量等
-heap 顯示Java堆的詳細信息,如使用哪種回收器、參數配置、分代情況等
-clstats 以ClassLoader為統計口徑顯示永久代內存狀態
-finalizerinfo 顯示再F-Queue中等待Finalizer線程執行finalizer方法的對象
此命令用法較多,舉幾個常用的:
當系統發生內存溢出時,我們可以使用此命令查詢當前JVM堆中存活的類的實例數量統計:
我們還可以用此命令生成虛擬機dump快照文件:
其他的參數就不一一實驗了,有興趣的同學可以自己試一試。
jhat:虛擬機堆轉儲快照分析工具,和jmap搭配使用
Sun JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,可以在瀏覽器中查看。
使用命令( jhat item.bin )
屏幕顯示“Server is ready.”的提示後,用戶在瀏覽器中鍵入http://localhost:7000/就可以看到分析結果,如下圖所示:
jstack:java堆棧跟蹤工具
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(一般稱為threaddump或者javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做些什麽事情,或者等待著什麽資源。
格式如下:
jstack[option]vmid
-F 當正常輸出的請求不被相應時,強制輸出線程堆棧
-l 除堆棧外,顯示關於鎖的附加信息
-m 如果調用到本地方法的話,可以顯示C/C++的堆棧
示例如下:
世界上並沒有完美的程序,但我們並不因此而沮喪,因為寫程序本來就是一個不斷追求完美的過程。
THE END.
JVM性能監控與故障處理命令匯總(jps、jstat、jinfo、jmap、jhat、jstack)