jvisualvm功能演示

1。啓動

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

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

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

3.右鍵點擊它,”打開”

可以看到它有很多標籤頁,可以讓我們監測程序的各種數據。默認沒有這麼多,我其實安裝了一些jvisualvm的插件。

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

5。查看cpu、內存、類、線程的統計數據

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

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

6。查看各線程運行情況

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

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

  1. 運行(Running):我們最喜歡的狀態。說明該線程正在執行代碼,沒有問題。
  2. 休眠(Sleeping):調用了Thread.sleep後的狀態,說明線程正停在某個Thread.sleep處
  3. 等待(Wait):手動調用了wait方法,或者某些IO操作,在阻塞中等待數據。
  4. 監視(Monitor):這裏就是我想找的問題了。它表示線程想執行一段synchronized中的代碼,但是發現已經有其它線程正在執行,自己被block了,只能無奈地等待。如果這種狀態多,說明程序需要好好優化。

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

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

7。查看各線程的統計數據

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

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

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

8。查看各方法的運行時間

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

我們需要先點擊上面的”CPU”按鈕,它纔會開始統計,下面的數據會慢慢多起來。從上圖可以看出,程序一直在運行SynIncer.inc()方法,它佔用了所有方法執行總時間的99.8%。如果我們想提高程序性能,則需要重點優化它,讓它運行得更快。

還想知道方法被調用的次數?使用”Profiler”頁中的功能:

它與抽樣器很像,但是最後多了一個”調用次數”。

9。查看哪些對象佔用了最多的內存

當出現了內存不足的錯誤時,想不想知道到底是哪些對象把內存都佔用了?這時需要使用”抽樣器”的”內存”檢測功能:

從表中可以看出當前最多的是哪些對象,它們有多少個,用了多少個字節。

10。安裝更多插件

jvisualvm還在線提供了很多插件,提供了更多的功能。我們可以通過”工具”->”插件”,找到並安裝它們。推薦全裝,比如我就安裝了全部(當前有16個):

安裝重啓後,再找到某個程序節點,就會發現有更多的標籤頁可用。

11。查看MBeans

MBeans可以將程序中的某些信息暴露給外部。有一些庫在設計時,就考慮到了這一點。如果我們不滿足於前面那些基礎信息,可以在這裏看看。

由於當前程序沒有使用到提供MBeans信息的庫,所以看不到什麼多少有用的信息。如果你使用了某些數據庫連接池(提供了MBeans功能的),可以在這裏看到池裏的一些信息,還可以通過”Operations”標籤頁,對程序數據進行一些修改。

12。查看gc情況

垃圾回收是我們不能忽略的一個地方。我們可以通過”Visual GC”頁,查看到非常詳細的垃圾回收情況。

可以說,這個功能提供的信息真是非常地詳盡,連兩個小Eden的情況也實時地表現出來了。不過要看懂這些數據,還是需要先到網上看看講解Java垃圾回收的文章,瞭解其內部原理才行。

13。更多更詳細的監測內容

Tracer頁提供了更多的監測內容

可以看到程序中遍佈探針,讓我們實時瞭解到各處的運行情況。先選中感興趣的內容,然後點擊”Start”按鈕即可。

這一塊比較專業,普通開發人員可能都不知道這些數據到底有什麼用。但專業人士可能會覺得會很需要它們。

JvisualVM的大部分功能都已經演示完了,我想它的功能的確很強大,在我們平時的開發中會非常有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章