最近在把一個重構(gòu)完的項目放到beta環(huán)境測試時,
順帶實踐了一下Java Mission Control(簡稱JMC)來分析jvm。發(fā)現(xiàn)確實好用,個人覺得作為要收費的JProfile的代替品已經(jīng)足夠用了。
JMC可以看的東西太多,選一些自己覺得最有用的來總結(jié)一下:
JMC
JDk7 7u40之后自帶。主要有兩種功能
- 實時監(jiān)控JVM運行時的狀態(tài)
- Java Flight Recorder 取樣分析
實時監(jiān)控
如果是遠程服務(wù)器,使用前要開JMX
-Dcom.sun.management.jmxremote.port=${YOUR PORT}
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${YOUR HOST/IP}
File -> Connetct -> Create A New Connection, 填入上面JMX參數(shù)的host和port,服務(wù)器賬號密碼。

通過“+”按需添加各種統(tǒng)計圖表
Action

可以選擇各種Action,Condition設(shè)置條件,條件達到Action就會被觸發(fā)。
例如,你可以設(shè)置heap dump當(dāng)接近memory limit;又或者在CPU高消耗期間觸發(fā) JFR recoding了解發(fā)生了什么鬼。
另外action也可以選擇log或者發(fā)送郵件的方式
Memory

內(nèi)存tab提供heap和GC的信息。個人最主要看GC次數(shù)、時間;以及隨著GC發(fā)生heap的內(nèi)存變化情況,以便來調(diào)整jvm參數(shù)進行優(yōu)化。
Threads

主要看每條線程所占的CPU、死鎖檢測以及線程是被哪個代碼阻塞的(Lock Name)
Flight Recorder
要使用取樣,需要先添加參數(shù)
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
取樣時間默認1分鐘,可自行按需調(diào)整,事件設(shè)置選為profiling,然后可以設(shè)置都需要profile哪些信息,比如:
- 加上對象數(shù)量的統(tǒng)計:Java Virtual Machine->GC->Detail->Object Count/Object Count after GC
- 方法調(diào)用采樣的間隔從10ms改為1ms(但不能低于1ms,否則會影響性能了): Java Virtual Machine->Profiling下的兩個選項
- Socket與File采樣, 10ms太久,但即使改為1ms也未必能抓住什么,可以干脆取消掉: Java Application->File Read/FileWrite/Socket Read/Socket Write
然后就開始Profile,到時間后Profile結(jié)束,會自動把記錄下載回來,在JMC中展示。
General
JVM Information tab包含所有JVM 參數(shù),可以在這里查看,當(dāng)然也可以在服務(wù)器上通過 XX:+PrintFlagsFinal 查看
Memory
GC詳細信息(Garbage Collections、GC Times)- gc次數(shù),每次gc時的詳細信息,幾時發(fā)生gc,什么gc,持續(xù)時間,clean了多少空間等
內(nèi)存分配(Allocations) - 讓對象分配情況無所遁形。 按類、按線程、對象的創(chuàng)建調(diào)用棧來查看對象創(chuàng)建情況, 可以看到TLAB內(nèi)/外的分配情況(每條線程在Heap里分了一個Thread Local Area,在TLAB里的內(nèi)存分配不需要線程競爭)
一般來說,盡可能確保以下幾點,你的程序會跑得更快:
- 分配更少的對象
- 盡可能少進行 full gc
- 盡可能少在TLAB外分配對象
Code
Hot packages: 熱點packages統(tǒng)計,看以看每個Java package的耗時
Hot classes:熱點class統(tǒng)計,能看出哪個class最耗CPU
Threads
- Contention:線程爭奪,統(tǒng)計哪些線程被哪些方法阻塞,阻塞多久
- Lock Instances:展示哪些鎖實例會導(dǎo)致線程爭奪
要提高吞吐量,可以根據(jù)以上兩點來做優(yōu)化
參考:
java-performance.info上的介紹文章
另一份Java應(yīng)用調(diào)優(yōu)指南之-工具篇