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