1. 程式人生 > 實用技巧 >jdk自帶檢測記憶體,cpu,執行緒 的工具——jvisualvm

jdk自帶檢測記憶體,cpu,執行緒 的工具——jvisualvm

一個很強大的免費工具:JDK6自帶的jvisualvm。

其實還有個自帶工具 jconsole 這裡不多說, 用法跟 jvisualvm 差不多。 都是輸入命令啟動

這個東西我以前聽過說,但一直沒有用過。看到它提供的截圖中可以看到各執行緒的執行狀態,所以準備試一下。這裡記錄一下使用過程。

1。啟動

在命令列輸入jvisualvm。如果jdk安裝正確的話(6.x以上版本),就會看到如下的一個視窗:

wKiom1Lh8zqzVqilAAJcr60e71Y391.jpg

看起來相當簡潔,不像是很強大的樣子。

2。執行一個Java程式IncTestN,jvisualvm會自動找到它

wKioL1Lh8y2i83zWAAI__zTrNtI026.jpg

3.右鍵點選它,”開啟”

wKiom1Lh83SR4wzmAAMuzI4Dwvs605.jpg

可以看到它有很多標籤頁,可以讓我們監測程式的各種資料。預設沒有這麼多,我其實安裝了一些jvisualvm的外掛。

4。檢視jvm引數及系統屬性

wKiom1Lh852CP_ejAAGtGaBF6iU708.jpg

5。檢視cpu、記憶體、類、執行緒的統計資料

wKioL1Lh85jDV0wpAANsvNefF4M165.jpg

注意,右邊第一個還可以檢視PermGen。對於scala程式,因為它產生了大量的類定義,所以PermGen有可能會不足,可通過該選項檢視PermGen,適當調整:

wKiom1Lh89bTpcLUAACg1Ag3LfY376.jpg

可以看到,對於本程式來說,PermGen還是比較充分的,無須調整。

6。檢視各執行緒執行情況

這個是重點,我們需要知道各執行緒的執行情況,特別是否被synchronized阻塞了。

wKioL1Lh88_RPRhPAANJCP_EtBI937.jpg

注意右下角,有四個狀態說明,分別是:

  1. 執行(Running):我們最喜歡的狀態。說明該執行緒正在執行程式碼,沒有問題。

  2. 休眠(Sleeping):呼叫了Thread.sleep後的狀態,說明執行緒正停在某個Thread.sleep處

  3. 等待(Wait):手動呼叫了wait方法,或者某些IO操作,在阻塞中等待資料。

  4. 監視(Monitor):這裡就是我想找的問題了。它表示執行緒想執行一段synchronized中的程式碼,但是發現已經有其它執行緒正在執行,自己被block了,只能無奈地等待。如果這種狀態多,說明程式需要好好優化。

從上面的這個圖可以看到,下面多個執行緒都處於”監視”狀態。多個執行緒都卡在了獨木橋的一頭過不去,幹不了活幹著急呢。

當然這個程式是我專門設計成這樣的,存在著嚴重的效能問題,需要好好優化。

7。檢視各執行緒的統計資料

如果我們需要一些統計資料,比如某個執行緒總共運行了多少時間,”執行”狀態有多久(或百分比),休眠、等待、監視有多久,則需要用到”表”這一頁。

wKioL1Lh8-my3Un5AAOkgoWZ2D4707.jpg

從中可以看到這個悲催的程式,幾分所有的時間都用在了synchronized的阻塞上了。只有百分之零點幾的時間在執行中,效率可真低啊。

還可以使用圖表方式來看這些資料,得到更直觀的體驗:

wKiom1Lh9C6zvhG5AAFac7alLS4002.jpg

8。檢視各方法的執行時間

想不想程式中到底是哪些方法一直在執行?可使用”抽樣器”功能:


轉載於:https://blog.51cto.com/yjflinchong/1354417