距離上次介紹Jconsole已經時隔兩周了,這期間由於工作中要用go來做一個新項目,所以精力都用在入門go上了,不過發現go語言用起來真的挺不錯的,比python感覺還好點,大家沒事可以了解下。
言歸正傳,VisualVM和Jconsole同是圖形化的jvm監控和分析工具,兩者在一些基本功能上的使用大同小異,比如內存、線程、jvm環境參數等,但是相對而言VisualVM的功能要稍強於Jconsole,相當於加強版的Jconsole。同是visualVM的一些高級功能是通過安裝插件來拓展,所以更能因需定制。先看下起始頁:

由於VisualVM官方已經提供了很完善的使用文檔(同樣是親兒子,Jconsole的文檔就有點寒摻了,而且VisualVM有一部分竟然有中文版),所以這里就不做詳細介紹,只重點看一下的VisualVM兩個方面:
- 插件安裝
- 程序性能分析
一、VisualVM插件安裝
這個其實沒什么好介紹的,基本上看圖就明白了。插件可以進行手工安裝,可以再插件中心下載*.nbm,在選項“工具—插件—已下載”中選擇安裝,但是作為一款便捷的圖形化工具,這樣做無意有點費事,其實在"工具—插件"中我們可以直接管理已安裝插件,並選擇下載安裝需要的新插件。看圖:
可以看到VisualVM提供了很豐富的插件,我們只要選中需要插件,點擊安裝即可(當然,前提是你待聯網了)。好了,就是這么簡單。
二、程序性能分析
這里使用我寫的一個小的web服務器做示例,介紹和代碼見博客(由於之后更新,可能github與介紹有一定出入),可運行包見下載(目前win下可直接通過bin下start.bat啟動,由於start.sh是拷之前一個項目的,暫時有些問題,所以linux下就直接java命令啟動吧),成功啟動后如下:
然后通過VisualVM打開對應進程,可以通過概述、監視、線程、visaul GC查看程序當前jvm參數、內存、cpu、線程和gc的各項情況。我們這里重點關注一下VisualVM提供的性能分析工具Profilter,我們直接打開該選項卡,點擊CPU將開始收集信息並分析。結果你可能發現當時只有ServerTimerTask.run()一項(也可能會有很多項,這主要由於是實時分析,看你打開時程序在做什么操作,是個web服務器,所以可能有個定時輪詢的任務一直在執行,所以至少會有這一項,而且包路徑sun.net.httpserver也可能看出這點),為了盡快看到更多調用信息,我們直接在瀏覽器打開http://localhost:8888/json/show.do (這是測試項目中測試json數據的路徑),會發現出現很多調用信息,截圖如下:
可以看到cpu耗時最多的是log,這其實也好理解,由於寫代碼的時候幾乎在每個操作內都打了log,而且還有寫外部log文件的操作,所以耗時較長,從這點看這個程序應該選擇一些關鍵地方打log,比如在調度模塊的起止地方、異常處理模塊里邊,而沒有必要每個操作都輸出信息。而第二個則是Exchange.run(),這個更好理解了,由於程序在http請求接收和相應處理上目前使用jdk的httpserver模塊,而Exchange正是對這些操作的封裝,是web服務器的核心模塊,cpu耗時多是自然的。第三名如果你看過代碼就明白了,responseToClient方法是將響應數據寫入響應流。其他的就不一一分析了,其實了解了功能和代碼就很容易看明白。
我們再來看下調用次數,按照調用次數排序后,會發現ServerTimerTask.run()調用次數遠遠高於其他方法,這個根據前邊說的應該都明白,就不解釋了。同時可以看一下responseToClient()的調用次數,會發現和你網頁上請求的次數一致。
最后我們來看一個典型的例子,我們在方法名過濾器輸入SessionCleanTask,結果如下:

下邊看下內存的分析,該項里邊可以看到每個對象實時的內存占用、對象數和年代數,具體分析思路其實和cpu大同小異, 就不再細說了,看圖:

好了,VisualVM介紹到此結束,其實其功能要比這強的多,比如dump文件分析和BTrace動態日志追蹤(通過熱插入日志代碼分析程序)等,感興趣就自行分析吧,這里還有一篇介紹VisualVM可供參考。
之后將考慮開始寫類文件結構和類加載部分,不過由於工作忙起來了,所以速度可能慢些,盡量一周至少一篇吧。不費話了,沒衣服穿了,出去買件衣服,不然明天木法上班了T_T。