JVM 調優工具研究
JDK自帶了一系列的工具,一般可用于JVM的調優實踐,這裡做一個研究。
1、jps
jps工具可以檢視到目前機器上運作的Java程式的JVM程序id,這個id通常是後續其他工具使用的基礎。另外,jps工具還有一些其他的參數,可以
允許我們檢視到Java程式的啟動參數和目前JVM的啟動參數。
exp:
# jps
8636 QuorumPeerMain
3497 Bootstrap
2486 Jps
參數: -l 顯示目前java啟動類的全程
-v 顯示JVM執行個體的啟動參數
-m 顯示java程式的啟動參數
2、jstat
jstat工具可以檢視到指定JVM執行個體的記憶體使用情況,如新生代、老年代等的gc情況。
參數詳解: jstat -option vmid interval
vmid 是jps查到的JVM執行個體的id
interval 是連續執行的間隔時間,可選參數,不填将隻執行一次
-option 是啟動參數,指定jstat指令顯示哪些資訊
-gcutil 最常用的指令了,可以檢視各個記憶體部分的使用情況和gc時間等資訊
-gc 更詳細的記憶體資訊,是gcutil的更新版本
-class 加載class的情況
-gccause 可以列印出gc原因
jstat -gcutil vmid 1s
output:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 22.02 3.27 5.50 49.12 63 186.797 0 0.000 186.797
每秒輸出一次
S0 是0号Survivor Space
S1 是1号Survivor Space
E 是Eden
O 是Old Generation
P 是Permanent Generation
YGC 是young gc的次數
YGCT 是young gc花費的總時間
FGC 是full gc的次數
FGCT 是full gc花費的總時間
GCT 是所有gc的時間
jstat -gc vmid 1s
output
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
9088.0 9088.0 0.0 2001.0 72832.0 24685.2 728192.0 40082.0 131072.0 64380.4 63 186.797 0 0.000 186.797
C代表Capacity,是可使用的空間
U代表Used, 是已用空間
3、jmap
jmap工具可以查到堆記憶體的具體使用情況,可以看到堆記憶體中每個類占的空間大小。
參數: jmap -option vmid
-option 是啟動參數,指定jmap要做的事情
-heap 可以看到堆記憶體的使用情況
-dump 常用的參數,可以導出一個記憶體映像檔案,解析之後可以看到記憶體的使用情況。jmap -dump:format=b,file=file.hprof vmid
jmap的導出檔案可以用eclipse mat工具來解析。
關于性能調優的一些思考:一般來說,java程式出現性能問題,是由機器本身的兩個瓶頸造成,一者是記憶體問題,另一則是CPU問題。java的性能問題基本可以由這兩個方面來解決。當出現性能問題,首先觀察問題出現的症狀,如果是方法執行時間過長或出現死鎖問題,則歸類于CPU問題,這類問題一般是由于代碼品質不高,或者是線程安全問題或者是算法效率太低引起的,那麼應該定位到問題所在,修改代碼;如果是程式出現偶發性的卡頓之類的問題,則診斷為記憶體問題,經常出現的情況就是頻繁GC導緻的卡頓等問題,這時候就可以用到我們的JDK工具來定位問題所在,進而解決問題。