A妒牙、 jps(Java Virtual Machine Process Status Tool)
jps主要用來輸出JVM中運行的進程狀態(tài)信息外邓。語法格式如下:
jps [options] [hostid]
如果不指定hostid就默認為當前主機或服務器。
jps -help
命令行參數選項說明如下:
-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全限名
-v 輸出傳入JVM的參數
B非凌、 jstack
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下:
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip
命令行參數選項說明如下:
-l long listings荆针,會打印出額外的鎖信息敞嗡,在發(fā)生死鎖時可以用jstack -l pid來觀察鎖持有情況
-m mixed mode颁糟,不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(比如Native方法)
jstack可以定位到線程堆棧喉悴,根據堆棧信息我們可以定位到具體代碼棱貌,所以它在JVM性能調優(yōu)中使用得非常多。下面我們來一個實例找出某個Java進程中最耗費CPU的Java線程并定位堆棧信息箕肃,用到的命令有ps婚脱、top、printf勺像、jstack障贸、grep。
1咏删、先得到進程ID為6011惹想,第二步找出該進程內最耗費CPU的線程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid
2督函、top -Hp 6011 定位線程pid,轉成16進制
3嘀粱、jstack 6011 | grep 16進制 定位代碼
C、 jmap(Memory Map)和jhat(Java Heap Analysis Tool)
jmap用來查看堆內存使用狀況辰狡,一般結合jhat使用锋叨。
jmap語法格式如下:
jmap [option] pid
jmap [option] executable core
jmap [option] [server-id@]remote-hostname-or-ip
如果運行在64位JVM上,可能需要指定-J-d64命令選項參數宛篇。
jmap -permstat pid
打印進程的類加載器和類加載器加載的持久代對象信息娃磺,輸出:類加載器名稱、對象是否存活(不可靠)叫倍、對象地址偷卧、父類加載器、已加載的類大小等信息
還有一個很常用的情況是:用jmap把進程內存使用情況dump到文件中吆倦,再用jhat分析查看听诸。jmap進行dump命令格式如下:
jmap -dump:format=b,file=dumpFileName pid
class name是對象類型,說明如下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 數組蚕泽,如[I表示int[]
[L+類名 其他對象
D晌梨、jstat(JVM統計監(jiān)測工具)
語法格式如下:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
vmid是虛擬機ID,在Linux/Unix系統上一般就是進程ID须妻。interval是采樣時間間隔仔蝌。count是采樣數目。比如下面輸出的是GC信息荒吏,采樣時間間隔為250ms敛惊,采樣數為4:
jstat -gc 21711 250 4
每隔5s監(jiān)控一次內存回收情況
jstat -gcutil pid 5s
E 代表 Eden 區(qū)使用率;
O(Old)代表老年代使用率 司倚;
P(Permanent)代表永久代使用率豆混;
CCS 壓縮使用比例
M 元空間(MetaspaceSize)已使用的占當前容量百分比
YGC(Young GC)代表Minor GC 次數篓像;
YGCT代表Minor GC耗時;
FGC(Full GC)代表Full GC次數皿伺;
FGCT(Full GC)代表Full GC耗時员辩;
GCT代表Minor & Full GC共計耗時。