前言
對于JVM的性能監控,主要注意以下關鍵參數,通過jdk自帶的命令行工具,即可查看相關參數,從而分析系統或目標服務程序中存在的性能瓶頸
jps
JVM Process Status Tool的縮寫,JVM進程狀況工具。
主要功能:
列出正在運行的java進程,并顯示執行主類的名稱及進程在本地JVM中的ID。
與ps命令相似,可以查看java進程ID(LVMID)。
使用方法:
jps [options][hostid]
[options]:
-q: 只輸出LVMID
-m: 輸出JVM啟動時傳給主類的方法
-l:輸出主類的全名,如果是Jar則輸出jar的路徑
-v: 輸出JVM啟動參數
jstat
JVM Statistics Monitoring Tool的縮寫,JVM統計信息監控工具。
主要功能:監控JVM各種運行狀態信息,如虛擬機進程中的類裝載、內存、GC、JIT編譯等數據。
使用方法:
jstat [options vmid [interval [s|ms] [count] ]]
參數解釋:
Options — 選項,一般使用 -gcutil 查看gc情況
vmid — VM的進程號,與LVMID一致,使用jps查看
interval– 間隔時間,單位為秒或者毫秒
count — 打印次數,如果缺省則打印無數次
注:
1、本地JVM進程:與LVMID一致,使用jps查看
2、遠程JVM進程:[protocol:][//]LVMID[@hostname[:post]/servername]
遠程查看,需在目標服務上啟動jstatd服務。
下面我們看下options選項:
jstat -class vmid:顯示加載class的數量,及所占空間等信息。
jstat -compiler vmid:顯示VM實時編譯的數量等信息。
jstat -gc vmid:顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity: 顯示VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。
jstat -gcnew vmid:new對象的信息。
jstat -gcnewcapacity vmid:new對象的信息及其占用量。
jstat -gcold vmid:old對象的信息。
jstat -gcoldcapacity vmid:old對象的信息及其占用量。
jstat -gcpermcapacity vmid: perm對象的信息及其占用量。
jstat -util vmid:統計gc信息統計。
jstat -printcompilation vmid:當前VM執行的信息。
jmap
JVM Memory Map for Java的縮寫,Java內存映像工具。
主要功能:
用于生成堆轉儲快照,即dump文件
可以查詢finalize執行隊列、Java堆和永久代的詳細信息(使用率、當前用的GC等)
使用方法:
jmap [ option ] pid
pid 與LVMID一致,使用jps查看
dump: [live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件。 live子選項是可選的,如果指定live選項,那么只輸出活的對象到文件。
finalizerinfo 打印正等待回收的對象的信息。
heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況。
histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”。 如果指定live,只統計活的對象數量。
permstat 打印classload和jvm heap長久層的信息。 包含每個classloader的名字、活動性、地址、父classloader和加載的class數量,內部String的數量和占用內存數也會打印出來。
F 強迫在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live參數無效。
h | -help 打印輔助信息
J 傳遞參數給jmap啟動的jvm.
注:使用jmap的時候JVM會處于假死狀態,所以只能在服務已死,但進程還在的情況下使用。
jstack
JVM Stack Trace for Java的縮寫,堆棧跟蹤工具。
主要功能:
- 用于生成JVM當前的線程快照(即當前JVM內每一個條線程正在執行的方法堆棧集合)
- 用于分析線程出現長時間停頓的原因
使用方法:
jstack [options] vmid
options:
-F 當正常輸出的請求不響應時,強制輸出線程堆棧(jstack [-l] pid無法響應時,強制打印堆棧)
-l 除堆棧信息外,顯示關于鎖的附加信息
-m
打印混合模式(Java和本地C/C++幀)的堆棧跟蹤信息。
-h
打印幫助信息。
-help
打印幫助信息。
jhat
用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,并支持對象查詢語言
java堆棧dump來源方式:
有以下幾種方式可以生成一個Java heap dump:
- 使用jmap -dump選項獲取一個運行時的heap dump。
- 使用jconsole選項通過運行時的HotSpotDiagnosticMXBean獲取一個heap dump。
- 通過指定-XX:+HeapDumpOnOutOfMemoryErrorVM選項,在拋出OutOfMemoryError錯誤時,將會生成一個heap dump。
- 使用hprof。
訪問 http://localhost:7000,就可以查看詳細的內存信息
有時dump出來的堆很大,在啟動時會報堆空間不足的錯誤,可以使用如下參數:
jhat -J-Xmx1024m <heap dump file>
總結
這些命令都在jdk的bin目錄里,是jdk自帶的一些監控分析工具,如果你在bin目錄下沒有找到對應的工具,說明該版本的jdk已經去除了該命令的支持。
在筆者日常性能測試診斷調優時,最常用的組合是jps和jstack,再加上第三方的分析工具。后續會介紹第三方的分析工具。