jvm 性能監控、故障處理工具

本文總結下jvm常用的排查問題的工具,包括jps、jstat、jinfo、jmap、jhat、jstack以及可視化管理工具Jconsole等。生產環境中,遇到問題時,可以用來參考。

JDK本身自帶了較多的工具可以使用,下面是windows版本,linux版本的工具也是同樣的,
在這裏插入圖片描述
準備
我們先創建一個springboot項目,然後打包放到linux環境中運行,具體參考之前文章《發佈springboot項目jar war 到linux服務器》

本文demo運行的是jar包,下面介紹常用的命令行工具。

一、jps 輸出java進行列表

jps(JVM Process Status),取名和功能都類似UNIX的ps命令。可以列出正在運行的虛擬機進程。

1. 命令格式:

jps [ option ] [ hostid ]

2. 示例:

jps -l
在這裏插入圖片描述

3. 命令彙總:

命令 作用
-l 輸出java進行號和主類全名,如果進行執行的是jar包,則輸出jar包路徑
-q 只輸出進行號列表
-m 輸出進行啓動時傳給主類main()函數的參數
-v 輸出虛擬機進程啓動時的jvm參數

二、jstat 輸出運行時垃圾收集等信息

jstat(JVM Statistics Monitoring Tool),用於監視jvm各種運行狀態信息的命令行工具。可以顯示本地或者遠程虛擬機進程中的類加載、內存、垃圾收集、即時編譯等運行時數據。

1. 命令格式
jstat [option vmid [ interval [s/ms] [count] ] ]

2.示例:

jstat -gc 1329 250 20
查詢進程號是1329的垃圾收集情況,每250ms收集一次,總共20次。如果不寫時間間隔和次數,默認表示查詢1次。
在這裏插入圖片描述
參數說明:

參數 含義
S0C 第一個survivor(倖存)區的大小
S1C 第二個survivor(倖存)區的大小
S0U 第一個survivor(倖存)區已經使用的大小
S1U 第二個survivor(倖存)區已經使用的大小
EC/EU Eden區大小/已使用大小
OC/OU old區大小/已使用大小
MC/MU 方法區大小/已使用大小
CCSC/CCSU 壓縮類空間大小/已使用大小
YGC/YGCT YongGC次數/YongGC耗時(秒)
FGC/FGCT FullGC次數/FullGC耗時(秒)
GCT 垃圾回收總的消耗時間(秒)

3.命令彙總

選項 作用
-class 輸出類加載、卸載數量、總空間以及類裝載所消耗的時間
-gc 顯示Java堆狀況,包括Eden區、兩個survivor區、老年代、方法區的容量等
-gccapacity 與-gc類似,但輸出主要關注Java堆各個區域使用到的最大、最小空間
-gcutil 與-gc基本相同,主要關注堆區各區域使用的百分比大小
-gccause 與-gcutil功能一樣,但是會輸出導致上一次垃圾收集產生的原因
-gcnew 監視新生代垃圾收集情況
-gcnewcapacity 與-gcnew基本相同,但主要輸出新生代使用到的最大和最小空間
-gcold 監視老年代垃圾收集情況
-gcoldcapacity 與-gcold基本相同,但主要輸出老年代使用到的最大和最小空間
-compiler 輸出即時編譯器編譯過的方法、耗時信息
-printcompilation 輸出已經被即時編譯的方法

三、jinfo 實時查看和調整虛擬機參數

jinfo(Confiuration Info for Java)的作用是實時查看和調整虛擬機的各項參數。

1. 命令格式:

jinfo [option] pid

2. 示例:

查詢CMSInitiatingOccupancyFraction參數值,

jinfo -flag CMSInitiatingOccupancyFraction 1329
在這裏插入圖片描述

四、Jmap java內存映像工具

jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般成爲heapdump或者dump文件)。

1.命令格式:

jmap [option] pid

2.示例:

dump堆信息到demodump.bin二進制文件中,
在這裏插入圖片描述
3. 命令彙總:

選項 作用
-dump 生成java堆轉儲快照。格式爲-dump:[live,]format=b,file= ,其中live子參數說明是否只dump存活的對象
heap 顯示java堆詳細信息,比如使用哪種回收器,參數配置,分代狀況等。只在linux/solaris平臺下有效
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執行finalizer方法的的對象。只在linux/solaris平臺下有效
-histo 顯示java堆詳細信息,包括類、示例數量、合計容量
-permstat 以ClassLoader爲統計口徑顯示永久代內存狀態,只在linux/solaris平臺下有效
-F 當虛擬機進程堆-dump選項沒有響應時,強制生成dump快照,只在linux/solaris平臺下有效

五、jhat 虛擬機轉儲快照分析工具

jhat(JVM Heap Analysis Tool),與jmap搭配使用,用來分析jmap生成的堆轉儲快照文件內容。但是在實際工作中,不建議使用這個工具,可以選擇其他可視化工具進行離線分析。

我們使用jma命令dump出來的文件demodump.bin文件爲例,使用jhat命令,然後如下:
在這裏插入圖片描述
等待顯示了Server is ready之後,使用瀏覽器訪問http://ip地址:7000,顯示如下:
在這裏插入圖片描述
頁面默認顯示【All classes including platform】,
拖到頁面最底部,可以發現還有其他類型的頁面功能:
在這裏插入圖片描述
翻譯過來如下:

  • 顯示堆中所有的類
  • 顯示根集能引用的對象
  • 顯示所有類的實例對象,包含platform的
  • 顯示所有類的實例對象,除去platform的
  • 顯示堆實例分佈表
  • 顯示最終摘要
  • 使用對象查詢語言查詢,具體語法可以使用頁面上方的【OQL Help】幫助

六、jstack java堆棧跟蹤工具

jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(一般成爲ThreadDump或者javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧集合,生成快照的目的一般都是用於定位線程出現長時間的停頓原因,比如死鎖、死循環、阻塞等。

1.命令格式:

jstack [option] pid

2.示例:
jstack -l 1329
在這裏插入圖片描述
或者使用jstack -l 1329 >>文件名.txt ,直接打印到txt文件中,然後離線分析。

3.命令彙總:

選項 作用
-l 除了堆棧外,顯示鎖的附件信息
-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-m 如果調用到本地方法的話,可以顯示C/C++的堆棧

七、JCconsole java監視與管理控制檯

JConsole(Java Monitoring and Managermen Console)是一款基於JMX(Java Managemen Extensions)的可視化監視、管理工具。

直接在windows版的jdk/bin目錄下,運行jconsole.exe ,
在這裏插入圖片描述
Jconsole會直接掃描而本地虛擬機進程,比如我用idea在本地跑的DemoApplicaton,可以選擇直接連接;
也可以選擇連接遠程進程,比如linux上跑的服務。
這裏直接選擇本地進程,顯示如下:
在這裏插入圖片描述

八、VisualVM 多合一故障處理工具

VisualVM(All-in-One Java Troubleshooting Tool)是功能最強大的運行監視和故障處理程序之一。

具有功能:

  • 顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo);
  • 監視應用程序的處理器、垃圾收集、堆、方法區以及線程的信息(jstat、jstack);
  • dump以及分析堆轉儲快照(jmap、jhat);
  • 方法級的程序運行性能分析,找出被調用最多、運行時間最長的方法;
  • 離線程序快照:收集程序運行時配置、線程dump、內存dump等信息建立一個快照,可以將快照發送開發者進行bug反饋。
  • 使用其他插件來擴展功能。

此工具同樣在jdk/bin目錄下,直接運行jvisualvm.exe文件。上文中使用jmap工具dump出來的demodump.bin文件,使用jvisualvm就可以打開分析。

【文件】->【裝入】,選擇堆dump文件,打開如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章