前言
對于JVM的性能監(jiān)控测蹲,主要注意以下關(guān)鍵參數(shù)棚壁,通過jdk自帶的命令行工具饺蔑,即可查看相關(guān)參數(shù),從而分析系統(tǒng)或目標服務(wù)程序中存在的性能瓶頸
jps
JVM Process Status Tool的縮寫令哟,JVM進程狀況工具。
主要功能:
列出正在運行的java進程杖刷,并顯示執(zhí)行主類的名稱及進程在本地JVM中的ID励饵。
與ps命令相似,可以查看java進程ID(LVMID)滑燃。
使用方法:
jps [options][hostid]
[options]:
-q: 只輸出LVMID
-m: 輸出JVM啟動時傳給主類的方法
-l:輸出主類的全名役听,如果是Jar則輸出jar的路徑
-v: 輸出JVM啟動參數(shù)
jstat
JVM Statistics Monitoring Tool的縮寫,JVM統(tǒng)計信息監(jiān)控工具表窘。
主要功能:監(jiān)控JVM各種運行狀態(tài)信息典予,如虛擬機進程中的類裝載、內(nèi)存乐严、GC瘤袖、JIT編譯等數(shù)據(jù)。
使用方法:
jstat [options vmid [interval [s|ms] [count] ]]
參數(shù)解釋:
Options — 選項昂验,一般使用 -gcutil 查看gc情況
vmid — VM的進程號捂敌,與LVMID一致,使用jps查看
interval– 間隔時間既琴,單位為秒或者毫秒
count — 打印次數(shù)占婉,如果缺省則打印無數(shù)次
注:
1、本地JVM進程:與LVMID一致甫恩,使用jps查看
2逆济、遠程JVM進程:[protocol:][//]LVMID[@hostname[:post]/servername]
遠程查看,需在目標服務(wù)上啟動jstatd服務(wù)。
下面我們看下options選項:
jstat -class vmid:顯示加載class的數(shù)量奖慌,及所占空間等信息抛虫。
jstat -compiler vmid:顯示VM實時編譯的數(shù)量等信息。
jstat -gc vmid:顯示gc的信息简僧,查看gc的次數(shù)建椰,及時間。其中最后五項涎劈,分別是young gc的次數(shù)广凸,young gc的時間,full gc的次數(shù)蛛枚,full gc的時間谅海,gc的總時間。
jstat -gccapacity: 顯示VM內(nèi)存中三代(young,old,perm)對象的使用和占用大小蹦浦,如:PGCMN顯示的是最小perm的內(nèi)存使用量扭吁,PGCMX顯示的是perm的內(nèi)存最大使用量,PGC是當前新生成的perm內(nèi)存占用量盲镶,PC是但前perm內(nèi)存占用量侥袜。其他的可以根據(jù)這個類推, OC是old內(nèi)純的占用量溉贿。
jstat -gcnew vmid:new對象的信息枫吧。
jstat -gcnewcapacity vmid:new對象的信息及其占用量。
jstat -gcold vmid:old對象的信息宇色。
jstat -gcoldcapacity vmid:old對象的信息及其占用量九杂。
jstat -gcpermcapacity vmid: perm對象的信息及其占用量。
jstat -util vmid:統(tǒng)計gc信息統(tǒng)計宣蠕。
jstat -printcompilation vmid:當前VM執(zhí)行的信息例隆。
jmap
JVM Memory Map for Java的縮寫,Java內(nèi)存映像工具抢蚀。
主要功能:
用于生成堆轉(zhuǎn)儲快照镀层,即dump文件
可以查詢finalize執(zhí)行隊列、Java堆和永久代的詳細信息(使用率皿曲、當前用的GC等)
使用方法:
jmap [ option ] pid
pid 與LVMID一致唱逢,使用jps查看
dump: [live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內(nèi)容到文件。 live子選項是可選的屋休,如果指定live選項,那么只輸出活的對象到文件坞古。
finalizerinfo 打印正等待回收的對象的信息。
heap 打印heap的概要信息博投,GC使用的算法,heap的配置及wise heap的使用情況盯蝴。
histo[:live] 打印每個class的實例數(shù)目,內(nèi)存占用,類全名信息. VM的內(nèi)部類名字開頭會加上前綴”*”毅哗。 如果指定live,只統(tǒng)計活的對象數(shù)量听怕。
permstat 打印classload和jvm heap長久層的信息。 包含每個classloader的名字虑绵、活動性尿瞭、地址、父classloader和加載的class數(shù)量翅睛,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會打印出來声搁。
F 強迫在pid沒有相應(yīng)的時候使用-dump或者-histo參數(shù). 在這個模式下,live參數(shù)無效。
h | -help 打印輔助信息
J 傳遞參數(shù)給jmap啟動的jvm.
注:使用jmap的時候JVM會處于假死狀態(tài)捕发,所以只能在服務(wù)已死疏旨,但進程還在的情況下使用。
jstack
JVM Stack Trace for Java的縮寫扎酷,堆棧跟蹤工具檐涝。
主要功能:
- 用于生成JVM當前的線程快照(即當前JVM內(nèi)每一個條線程正在執(zhí)行的方法堆棧集合)
- 用于分析線程出現(xiàn)長時間停頓的原因
使用方法:
jstack [options] vmid
options:
-F 當正常輸出的請求不響應(yīng)時,強制輸出線程堆棧(jstack [-l] pid無法響應(yīng)時法挨,強制打印堆棧)
-l 除堆棧信息外谁榜,顯示關(guān)于鎖的附加信息
-m
打印混合模式(Java和本地C/C++幀)的堆棧跟蹤信息。
-h
打印幫助信息凡纳。
-help
打印幫助信息窃植。
jhat
用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來荐糜,包括對象的數(shù)量巷怜,大小等等,并支持對象查詢語言
java堆棧dump來源方式:
有以下幾種方式可以生成一個Java heap dump:
- 使用jmap -dump選項獲取一個運行時的heap dump狞尔。
- 使用jconsole選項通過運行時的HotSpotDiagnosticMXBean獲取一個heap dump丛版。
- 通過指定-XX:+HeapDumpOnOutOfMemoryErrorVM選項,在拋出OutOfMemoryError錯誤時偏序,將會生成一個heap dump页畦。
- 使用hprof。
訪問 http://localhost:7000研儒,就可以查看詳細的內(nèi)存信息
有時dump出來的堆很大豫缨,在啟動時會報堆空間不足的錯誤,可以使用如下參數(shù):
jhat -J-Xmx1024m <heap dump file>
總結(jié)
這些命令都在jdk的bin目錄里端朵,是jdk自帶的一些監(jiān)控分析工具好芭,如果你在bin目錄下沒有找到對應(yīng)的工具,說明該版本的jdk已經(jīng)去除了該命令的支持冲呢。
在筆者日常性能測試診斷調(diào)優(yōu)時舍败,最常用的組合是jps和jstack,再加上第三方的分析工具。后續(xù)會介紹第三方的分析工具邻薯。