一個很強大的免費工具:JDK6自帶的jvisualvm。
其實還有個自帶工具 jconsole 這裏不多說, 用法跟 jvisualvm 差不多。 都是輸入命令啓動
這個東西我以前聽過說,但一直沒有用過。看到它提供的截圖中可以看到各線程的運行狀態,所以準備試一下。這裏記錄一下使用過程。
1。啓動
在命令行輸入jvisualvm。如果jdk安裝正確的話(6.x以上版本),就會看到如下的一個窗口:
看起來相當簡潔,不像是很強大的樣子。
2。運行一個Java程序IncTestN,jvisualvm會自動找到它
3.右鍵點擊它,”打開”
可以看到它有很多標籤頁,可以讓我們監測程序的各種數據。默認沒有這麼多,我其實安裝了一些jvisualvm的插件。
4。查看jvm參數及系統屬性
5。查看cpu、內存、類、線程的統計數據
注意,右邊第一個還可以查看PermGen。對於scala程序,因爲它產生了大量的類定義,所以PermGen有可能會不足,可通過該選項查看PermGen,適當調整:
可以看到,對於本程序來說,PermGen還是比較充分的,無須調整。
6。查看各線程運行情況
這個是重點,我們需要知道各線程的運行情況,特別是否被synchronized阻塞了。
注意右下角,有四個狀態說明,分別是:
運行(Running):我們最喜歡的狀態。說明該線程正在執行代碼,沒有問題。
休眠(Sleeping):調用了Thread.sleep後的狀態,說明線程正停在某個Thread.sleep處
等待(Wait):手動調用了wait方法,或者某些IO操作,在阻塞中等待數據。
監視(Monitor):這裏就是我想找的問題了。它表示線程想執行一段synchronized中的代碼,但是發現已經有其它線程正在執行,自己被block了,只能無奈地等待。如果這種狀態多,說明程序需要好好優化。
從上面的這個圖可以看到,下面多個線程都處於”監視”狀態。多個線程都卡在了獨木橋的一頭過不去,幹不了活乾着急呢。
當然這個程序是我專門設計成這樣的,存在着嚴重的性能問題,需要好好優化。
7。查看各線程的統計數據
如果我們需要一些統計數據,比如某個線程總共運行了多少時間,”運行”狀態有多久(或百分比),休眠、等待、監視有多久,則需要用到”表”這一頁。
從中可以看到這個悲催的程序,幾分所有的時間都用在了synchronized的阻塞上了。只有百分之零點幾的時間在運行中,效率可真低啊。
還可以使用圖表方式來看這些數據,得到更直觀的體驗:
8。查看各方法的運行時間
想不想程序中到底是哪些方法一直在運行?可使用”抽樣器”功能: