文章目錄
本文總結下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文件,打開如下: