JDK除了提供大量的命令行工具外靖榕,還有兩個(gè)功能強(qiáng)大的可視化工具:JConsole和VisualVM,這兩個(gè)工具是JDK的正式成員。
JConsole(Java監(jiān)視與管理控制臺(tái))
- JConsole(Java Monitoring and Management Console)是一種基于JMX的可視化監(jiān)視片林、管理工具。
- 它管理部分的功能是針對JMX MBean進(jìn)行管理怀骤,由于MBean可以使用代碼费封、中間件服務(wù)器的管理控制臺(tái)或者所有符合JMX規(guī)范的軟件進(jìn)行訪問,所以這里著重介紹監(jiān)視部分的功能蒋伦。
1. 啟動(dòng)JConsole
-
通過JDK/bin目錄下的“jconsole.exe”啟動(dòng)JConsole后弓摘,將自動(dòng)搜索處本機(jī)運(yùn)行的所有虛擬機(jī)進(jìn)程,不需要用戶自己使用jps來查詢了痕届。
JConsole連接界面.png -
主界面共包括“概述”衣盾、“內(nèi)存”、“線程”爷抓、“類”势决、“VM摘要”、“MBean”蓝撇。
JConsole主界面.png
“概述”頁簽顯示的是整個(gè)虛擬機(jī)主要運(yùn)行數(shù)據(jù)的概覽果复,其中包括“堆內(nèi)存使用情況”、“線程”渤昌、“類”虽抄、“CPU使用情況”4種信息的曲線圖走搁,這些曲線圖是后面“內(nèi)存”、“線程”迈窟、“類”頁簽的信息匯總私植。
2. 內(nèi)存監(jiān)控
-
“內(nèi)存”頁簽相當(dāng)于可視化的jstat命令,用于監(jiān)視受收集器管理的虛擬機(jī)內(nèi)存(Java堆和永久代)的變化趨勢车酣。
JConsole的內(nèi)存監(jiān)控.png
3. 線程監(jiān)控
- “線程”頁簽的功能相當(dāng)于可視化的jstack命令曲稼,遇到線程停頓時(shí)可以使用這個(gè)頁簽進(jìn)行監(jiān)控分析湖员。
- 線程長時(shí)間停頓的主要原因只要有:等待外部資源(數(shù)據(jù)庫連接贫悄、網(wǎng)絡(luò)資源、設(shè)備資源等)娘摔、死循環(huán)窄坦、鎖等待(活鎖和死鎖)。
JConsole的線程監(jiān)控.png
4.類監(jiān)控
5.VM監(jiān)控
6.MBean監(jiān)控
VisualVM(多合一故障處理工具)
VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序凳寺,并且可以預(yù)見在未來一段時(shí)間內(nèi)都是官方主力發(fā)展的虛擬機(jī)故障處理工具鸭津。
JDK8以后,不在提供visualvm.exe肠缨,需到官網(wǎng)下載相應(yīng)版本:https://visualvm.github.io/download.html
它還提供很多其他方面的功能曙博,如性能分析(Profiling)。
-
VisualVM還有一個(gè)很大的優(yōu)點(diǎn)
不需要被監(jiān)視的程序基于特殊Agent運(yùn)行怜瞒,因此它對應(yīng)用程序的實(shí)際性能的影響很小父泳,使得它直接應(yīng)用在生產(chǎn)環(huán)境中。
VisualVM主界面0.png
1. VisualVM兼容范圍與插件安裝
VisualVM基于NetBeans平臺(tái)開發(fā)吴汪,因此它一開始就具備了插件擴(kuò)展功能的特性惠窄,通過插件擴(kuò)展支持,VisualVM可以做到漾橙。
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程中的配置杆融、環(huán)境信息(jps、jinfo)霜运。
- 監(jiān)視應(yīng)用程序的CPU脾歇、GC、堆淘捡、方法區(qū)以及線程的信息(jstat藕各、jstack)。
- dump以及分析堆轉(zhuǎn)儲(chǔ)快照(jmap焦除、jhat)激况。
- 方法級的程序運(yùn)行性能分析,找出被調(diào)用最多、運(yùn)行時(shí)間最長的方法乌逐。
- 離線程序快照:收集程序的運(yùn)行時(shí)配置竭讳、線程dump、內(nèi)存dump等信息建立一個(gè)快照浙踢,可以將快照發(fā)送開發(fā)者處進(jìn)行Bug反饋绢慢。
- 其它plugins的無限的可能性...
首次啟動(dòng)VisualVM后,不必著急找應(yīng)用程序進(jìn)行監(jiān)測洛波,因?yàn)樵賄isualVM還沒有加載任何插件胰舆,雖然基本的監(jiān)視、線程面板的功能主程序都以默認(rèn)插件的形式提供了奋岁,但是不給VisualVM裝任何擴(kuò)展插件,就相當(dāng)于放棄了它最精華的功能荸百,和沒有安裝任何應(yīng)用軟件操作系統(tǒng)差不多闻伶。
2.生成、瀏覽堆轉(zhuǎn)儲(chǔ)快照
- 在VisualVM中生成dump文件有兩種方式够话,可以執(zhí)行下列任一操作
- 在“應(yīng)用程序”窗口中右鍵單擊應(yīng)用程序節(jié)點(diǎn)蓝翰,然后選擇“堆Dump”。
- 在“應(yīng)用程序”窗口中雙擊應(yīng)用程序節(jié)點(diǎn)以打開應(yīng)用程序標(biāo)簽女嘲,然后在“監(jiān)視”標(biāo)簽中單擊“堆Dump”畜份。
生成了dump文件之后,應(yīng)用程序頁簽將在該堆的應(yīng)用程序下增加一個(gè)以[heapdump]開頭的子節(jié)點(diǎn)欣尼,并且在主頁簽中打開了該轉(zhuǎn)儲(chǔ)快照爆雹。
從堆頁簽中的“摘要”面板可以看到應(yīng)用程序dump時(shí)的運(yùn)行時(shí)參數(shù)、System.getProperties()的內(nèi)容愕鼓、線程堆棧等信息钙态,“類”面板則是以類為統(tǒng)計(jì)口徑統(tǒng)計(jì)類的實(shí)例數(shù)量、容量信息菇晃,“實(shí)例”面板不能直接使用册倒,因?yàn)椴荒艽_定用戶想查看哪個(gè)類的實(shí)例,所以需要通過“類”面板進(jìn)入磺送,在“類”中選擇一個(gè)關(guān)心的類后雙擊鼠標(biāo)驻子,即可在“實(shí)例”里面看見此類的500個(gè)實(shí)例的具體屬性信息」啦樱“OQL控制臺(tái)”面板中就是運(yùn)行OQL查詢語句的崇呵,同jhat中介紹的OQL功能一樣。
3.分析程序性能
- 在Profiler頁簽中馅袁,VisualVM提供了程序運(yùn)行期間方法級的CPU執(zhí)行時(shí)間分析以及內(nèi)存分析演熟,做Profiling分析肯定會(huì)對程序運(yùn)行性能有比較大的影響,所以一般不在生產(chǎn)環(huán)境中使用這項(xiàng)功能。
- 要開始分析芒粹,先選擇“CPU”和“內(nèi)存”按鈕中的一個(gè)兄纺,然后切換到應(yīng)用程序中對程序進(jìn)行操作,VisualVM會(huì)記錄到這段時(shí)間中應(yīng)用程序執(zhí)行過的方法化漆。
如果是CPU分析估脆,將會(huì)統(tǒng)計(jì)每個(gè)方法的執(zhí)行次數(shù)、執(zhí)行耗時(shí)座云;
如果是內(nèi)存分析疙赠,則會(huì)統(tǒng)計(jì)每個(gè)方法關(guān)聯(lián)的對象數(shù)以及這些對象所占的空間。
分析結(jié)束后朦拖,點(diǎn)擊“停止”按鈕結(jié)束監(jiān)控過程圃阳。
4.BTrace動(dòng)態(tài)日志跟蹤
- BTrace是一個(gè)很“有趣”的VisualVM插件,本身也是可以獨(dú)立運(yùn)行的程序璧帝。
- 它的作用是在不停止目標(biāo)程序運(yùn)行的前提下层坠,通過HotSpot虛擬機(jī)的HotSwap技術(shù)動(dòng)態(tài)加入原本并不存在的調(diào)試代碼橘洞。
- BTrace的用法還有許多,打印調(diào)用堆棧、參數(shù)舰绘、返回值只是最基本的應(yīng)用笼才,在它的網(wǎng)站上有使用BTrace進(jìn)行性能監(jiān)視步责、定位連接泄漏和內(nèi)存泄漏拔疚、解決多線程競爭問題等例子。