jdk自帶檢測內存,cpu,線程 的工具——jvisualvm

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

其實還有個自帶工具 jconsole   這裏很少說, 用法跟 jvisualvm 差很少。 都是輸入命令啓動
ide

這個東西我之前聽過說,但一直沒有用過。看到它提供的截圖中能夠看到各線程的運行狀態,因此準備試一下。這裏記錄一下使用過程。工具

1。啓動性能

在命令行輸入jvisualvm。若是jdk安裝正確的話(6.x以上版本),就會看到以下的一個窗口:優化

wKiom1Lh8zqzVqilAAJcr60e71Y391.jpg

看起來至關簡潔,不像是很強大的樣子。spa

2。運行一個Java程序IncTestN,jvisualvm會自動找到它插件

wKioL1Lh8y2i83zWAAI__zTrNtI026.jpg

3.右鍵點擊它,」打開」命令行

wKiom1Lh83SR4wzmAAMuzI4Dwvs605.jpg

能夠看到它有不少標籤頁,可讓咱們監測程序的各類數據。默認沒有這麼多,我其實安裝了一些jvisualvm的插件。線程

4。查看jvm參數及系統屬性scala

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。查看各方法的運行時間

想不想程序中究竟是哪些方法一直在運行?可以使用」抽樣器」功能:

相關文章
相關標籤/搜索