在java程序運(yùn)行時碉考,我們不僅僅需要關(guān)注基本的功能實現(xiàn)塌计,還需要關(guān)注性能相關(guān)的問題,除了軟件額度相關(guān)功能以外侯谁,性能可以說是衡量軟件優(yōu)劣最重要的指標(biāo)之一锌仅。之前我總結(jié)了一些在linux系統(tǒng)下提供給我們的診斷程序運(yùn)行性能的工具章钾,感興趣的同學(xué)可以去看一下:
https://juejin.im/post/5d71f1e3e51d453c135c5b41
下面主要說的就是jdk自帶提供給我們的用于性能監(jiān)控和進(jìn)行診斷的一些工具,掌握好這些工具的使用热芹,可以讓我們更好的去在實際開發(fā)過程中改善系統(tǒng)的性能問題贱傀,以及出現(xiàn)復(fù)雜的內(nèi)存異常時,能更好的進(jìn)行診斷并解決.
1.查看java進(jìn)程--jps命令
jps命令類似于linux下的ps伊脓,但它只用于列出java的進(jìn)程府寒,直接運(yùn)行的話,不加任何參數(shù)报腔,可以列出java程序程序進(jìn)程id以及Main函數(shù)的名稱株搔。
如下示例:
jps -m -l -p
其中有一些參數(shù)的含義,例如: -m用于輸出傳輸給java進(jìn)程的參數(shù)纯蛾。
-v 可以顯示傳遞給java虛擬機(jī)的參數(shù)
2纤房、查看虛擬機(jī)運(yùn)行時命令- jstat(常用)
這個命令可以觀察java應(yīng)用程序運(yùn)行時相關(guān)信息的工具。功能非常強(qiáng)大茅撞,可以利用它查看堆棧信息帆卓。
語法如下:
選項option可以由以下值構(gòu)成:
-t參數(shù)可以在輸出信息加上一個timeestamp列,顯示程序運(yùn)行的時候米丘。
-h參數(shù)可以在周期性數(shù)據(jù)輸出時剑令,輸出多少行數(shù)據(jù)后,跟著輸出一個表頭的信息拄查。
interval參數(shù)用于指定輸出統(tǒng)計數(shù)據(jù)的周期吁津,單位為毫秒。
count用于指定一個輸出多少次數(shù)據(jù)堕扶。
下面看代碼例子:
例1
jstat -class -t -h1 9876 1000 2
在-class的輸出中碍脏,以上表示進(jìn)程9876的classLoad的相關(guān)信息,每秒統(tǒng)計一次信息稍算,一共輸出兩次典尾。每打印一行,輸出頭部信息糊探。
load表示載入類的數(shù)量钾埂,Byte表示載入類的大小,Unload表示卸載類的數(shù)量科平,第二個Byte表示卸載類的大小褥紫。Time表示加載和卸載類上所花的時間。
例2: 查看jit編譯信息
以上結(jié)果:
Compiled表示編譯任務(wù)的執(zhí)行的次數(shù)瞪慧,F(xiàn)ailed表示編譯失敗的次數(shù)髓考,Invalid表示編譯不可用的次數(shù),Time表示編譯的總耗時弃酌,F(xiàn)ailedType表示最后一次編譯失敗的類型氨菇,F(xiàn)ailedMethod表示最后一次編譯失敗的類名和方法名儡炼。
例三:查看GC堆的信息。
jstat -gc 9876
MC:方法區(qū)大小
MU:方法區(qū)使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
還可以顯示各個年代的信息:
jstat -gccapacity 9876
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:當(dāng)前新生代容量
S0C:第一個幸存區(qū)大小
S1C:第二個幸存區(qū)的大小
EC:伊甸園區(qū)的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:當(dāng)前老年代大小
OC:當(dāng)前老年代大小
MCMN:最小元數(shù)據(jù)容量
MCMX:最大元數(shù)據(jù)容量
MC:當(dāng)前元數(shù)據(jù)空間大小
CCSMN:最小壓縮類空間大小
CCSMX:最大壓縮類空間大小
CCSC:當(dāng)前壓縮類空間大小
YGC:年輕代gc次數(shù)
FGC:老年代GC次數(shù)
還可以查看最近一次GC的原因以及當(dāng)前gc的原因:
jstat -gccause 9876
LGGC: 上次GC的原因门驾。
GCC: 當(dāng)前GC的原因射赛。
以下整理一些參數(shù)多柑,結(jié)合以上的例子奶是,可以看不同年代的區(qū)的信息
-gcnew : 新生代
-gcnewcapacity 詳細(xì)輸出新生代的各個區(qū)大小信息。
-gcold 展示老年代的gc情況
-gcpacacity 永久區(qū)的使用情況
-gcutil 展示gc回收的相關(guān)信息
查看虛擬機(jī)參數(shù) jinfo(常用)
該命令可以用來查看正在運(yùn)行的java虛擬機(jī)的擴(kuò)展參數(shù)竣灌,甚至支持在運(yùn)行時修改擴(kuò)展參數(shù)聂沙。
語法如下
jinfo <option> <pid>
其中option可以為如下信息:
-flag 打印指定虛擬的參數(shù)值
-flag[+|-]< name >: 指定java虛擬機(jī)參數(shù)的布爾值
-flag< name > 指定java虛擬機(jī)參數(shù)的值
很多情況下,java應(yīng)用程序不會指定所有的虛擬機(jī)的參數(shù)值初嘹,此時及汉,開發(fā)人員可以通過該命令找到虛擬機(jī)參數(shù)的當(dāng)前值。
例如:
jinfo -flag PrintDeatils 9876 -XX:-PrintDetails
jinfo不僅可以查看運(yùn)行時虛擬機(jī)某個參數(shù)的值也可以運(yùn)行時修改部分參數(shù)的值屯烦,并立即生效坷随。
4、導(dǎo)出堆到文件----jmap(常用)
jmap命令可以生成java程序的堆dump文件驻龟,也可以查看堆內(nèi)對象實例的統(tǒng)計信息温眉、查蘭classLoader的信息和finalizer隊列。
1.生成java程序的堆dump文件,得到當(dāng)前堆快照
jmap -dump:format=b,file=c:\heap.hprof
在生成了堆快照后翁狐,可以通過多種工具分析該堆文件类溢。
2.查看classLoader的信息
jmap -clstats [pid]
3.生成java程序的對象統(tǒng)計信息,并輸出到s.txt文件
jmap -histo [pid] >c:\s.txt
結(jié)果如下:
5.jdk自帶的堆分析工具---jhat
可以用于分析java應(yīng)用程序的堆快照內(nèi)容
jhat 堆文件地址
6.查看線程的堆棧---jstack(常用)
用于導(dǎo)出java應(yīng)用程序的線程堆棧
jstack -l <pid>
-l 用于打印鎖的附加信息
運(yùn)行一個死鎖的線程:
從信息的最后一行露懒,我們很容易得到死鎖的發(fā)生闯冷,同時找到了死鎖的兩個線程,以及死鎖線程的持有對象和等待對象懈词。
7.遠(yuǎn)程主機(jī)信息收集---jstatd命令
jstatd 是一個RMI服務(wù)端程序蛇耀,作用相當(dāng)于代理服務(wù)器,建立本地計算機(jī)與遠(yuǎn)程監(jiān)控工具的通信坎弯。jstatd服務(wù)器會將本機(jī)的java應(yīng)用程序傳遞到遠(yuǎn)程計算機(jī)
直接打開可能會拋出拒絕訪問的異常纺涤,因此需要使用java的安全策略,為其分配權(quán)限荞怒。
下面會為jstatd分配最大的權(quán)限洒琢,將其保存在jstatd.all.policy文件中。
然后使用如下命令再次開啟jstatd服務(wù)器:
就可以開啟成功了褐桌。