Java Mission Control之使用

最近在把一個重構(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ù)器賬號密碼。

jmc_main_monitoring

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

Action

Triggets

可以選擇各種Action,Condition設(shè)置條件,條件達到Action就會被觸發(fā)。

例如,你可以設(shè)置heap dump當(dāng)接近memory limit;又或者在CPU高消耗期間觸發(fā) JFR recoding了解發(fā)生了什么鬼。

另外action也可以選擇log或者發(fā)送郵件的方式

Memory

Memory

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

Threads

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)指南之-工具篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容