最近在把一個(gè)重構(gòu)完的項(xiàng)目放到beta環(huán)境測(cè)試時(shí)啼止,
順帶實(shí)踐了一下Java Mission Control(簡稱JMC)來分析jvm。發(fā)現(xiàn)確實(shí)好用兵罢,個(gè)人覺得作為要收費(fèi)的JProfile的代替品已經(jīng)足夠用了献烦。
JMC可以看的東西太多,選一些自己覺得最有用的來總結(jié)一下:
JMC
JDk7 7u40之后自帶卖词。主要有兩種功能
- 實(shí)時(shí)監(jiān)控JVM運(yùn)行時(shí)的狀態(tài)
- Java Flight Recorder 取樣分析
實(shí)時(shí)監(jiān)控
如果是遠(yuǎ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ù)器賬號(hào)密碼即横。
通過“+”按需添加各種統(tǒng)計(jì)圖表
Action
可以選擇各種Action噪生,Condition設(shè)置條件,條件達(dá)到Action就會(huì)被觸發(fā)东囚。
例如跺嗽,你可以設(shè)置heap dump當(dāng)接近memory limit;又或者在CPU高消耗期間觸發(fā) JFR recoding了解發(fā)生了什么鬼页藻。
另外action也可以選擇log或者發(fā)送郵件的方式
Memory
內(nèi)存tab提供heap和GC的信息桨嫁。個(gè)人最主要看GC次數(shù)、時(shí)間份帐;以及隨著GC發(fā)生heap的內(nèi)存變化情況璃吧,以便來調(diào)整jvm參數(shù)進(jìn)行優(yōu)化。
Threads
主要看每條線程所占的CPU废境、死鎖檢測(cè)以及線程是被哪個(gè)代碼阻塞的(Lock Name)
Flight Recorder
要使用取樣畜挨,需要先添加參數(shù)
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
取樣時(shí)間默認(rèn)1分鐘,可自行按需調(diào)整噩凹,事件設(shè)置選為profiling巴元,然后可以設(shè)置都需要profile哪些信息,比如:
- 加上對(duì)象數(shù)量的統(tǒng)計(jì):Java Virtual Machine->GC->Detail->Object Count/Object Count after GC
- 方法調(diào)用采樣的間隔從10ms改為1ms(但不能低于1ms驮宴,否則會(huì)影響性能了): Java Virtual Machine->Profiling下的兩個(gè)選項(xiàng)
- Socket與File采樣, 10ms太久务冕,但即使改為1ms也未必能抓住什么,可以干脆取消掉: Java Application->File Read/FileWrite/Socket Read/Socket Write
然后就開始Profile幻赚,到時(shí)間后Profile結(jié)束禀忆,會(huì)自動(dòng)把記錄下載回來,在JMC中展示落恼。
General
JVM Information tab包含所有JVM 參數(shù)箩退,可以在這里查看,當(dāng)然也可以在服務(wù)器上通過 XX:+PrintFlagsFinal
查看
Memory
GC詳細(xì)信息(Garbage Collections佳谦、GC Times)- gc次數(shù)戴涝,每次gc時(shí)的詳細(xì)信息,幾時(shí)發(fā)生gc钻蔑,什么gc啥刻,持續(xù)時(shí)間,clean了多少空間等
內(nèi)存分配(Allocations) - 讓對(duì)象分配情況無所遁形咪笑。 按類可帽、按線程、對(duì)象的創(chuàng)建調(diào)用棧來查看對(duì)象創(chuàng)建情況窗怒, 可以看到TLAB內(nèi)/外的分配情況(每條線程在Heap里分了一個(gè)Thread Local Area映跟,在TLAB里的內(nèi)存分配不需要線程競爭)
一般來說蓄拣,盡可能確保以下幾點(diǎn),你的程序會(huì)跑得更快:
- 分配更少的對(duì)象
- 盡可能少進(jìn)行 full gc
- 盡可能少在TLAB外分配對(duì)象
Code
Hot packages: 熱點(diǎn)packages統(tǒng)計(jì)努隙,看以看每個(gè)Java package的耗時(shí)
Hot classes:熱點(diǎn)class統(tǒng)計(jì)球恤,能看出哪個(gè)class最耗CPU
Threads
- Contention:線程爭奪,統(tǒng)計(jì)哪些線程被哪些方法阻塞荸镊,阻塞多久
- Lock Instances:展示哪些鎖實(shí)例會(huì)導(dǎo)致線程爭奪
要提高吞吐量咽斧,可以根據(jù)以上兩點(diǎn)來做優(yōu)化
參考:
java-performance.info上的介紹文章
另一份Java應(yīng)用調(diào)優(yōu)指南之-工具篇