VisualVM 性能分析概述


VisualVM是一個免費的Java應用監控、分析工具。

簡單說來,VisualVM是一種集成了多個JDK命令行工具的可視化工具,它能為您提供強大的分析能力。所有這些都是免費的!它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo,這些工具與JDK的標准版本是一致的。

你可以使用VisualVM生成和分析海量數據、跟蹤內存泄漏、監控垃圾回收器、執行內存和CPU分析,同時它還支持在MBeans上進行瀏覽和操作。盡管VisualVM自身要在JDK6這個版本上運行,但是JDK1.4以上版本的程序它都能監控。

安裝

JDK1.6 Update7之后的版本中默認就帶了 VisualVM,在bin目錄下的 jvisualvm 就是:

Mac 下 JDK 默認安裝在 /Library/Java/JavaVirtualMachines/版本號 目錄下。

image

如果你想用最新版本的,則可以自行在 https://visualvm.java.net/ 下載。最新版本是 1.3.8 (2014年7月1日發布的)

 

VisualVM 左側導航中,我們可以看到它具有 “本地”、“遠程”、“快照”等功能。如下圖是我本地 XMind的監控情況。

image

 

下面的幾個分析以 dubbo 的 demo 例子為例進行的截圖。

內存分析

在監視標簽內,我們可以看到實時的應用程序內存堆以及永久保留區域的使用情況。

內存堆使用情況

image

 

永久保留區域使用情況

image

Heap跟PermGen的區別, 一般而言,PerGen放的是類的定義;而Heap里面放的是類的實例;所以一般程序穩定運行后,PermGen基本保持不變,要變也只會增加,因為GC只會掃描heap中的實例;而Heap變化較大,OutOfMemory一般也是Heap不夠了。

 

OOM時對轉存

此外,我們也可以通過 Applications 窗口右擊應用程序節點來啟用“在出現 OOME 時生成堆 Dump”功能,當應用程序出現 OutOfMemory 異常時,VisualVM 將自動生成一個堆轉儲。

image

內存分析結果

在 Profiler 標簽,點擊“內存”按鈕將啟動一個內存分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果。通過內存性能分析結果,我們可以查看哪些對象占用了較多的內存,存活的時間比較長等,以便做進一步的優化。
此外,我們可以通過性能分析結果下方的類名過濾器對分析結果進行過濾。

image

 

CPU 分析

CPU使用情況

在監視標簽內,我們可以查看 CPU 的使用率以及垃圾回收活動對性能的影響。過高的 CPU 使用率可能是由於我們的項目中存在低效的代碼,可以通過 Profiler 標簽的 CPU 性能分析功能進行詳細的分析。如果垃圾回收活動過於頻繁,占用了較高的 CPU 資源,可能是由內存不足或者是新生代和舊生代分配不合理導致的等。

image

CPU 性能分析結果

在 Profiler 標簽,點擊“CPU”按鈕啟動一個 CPU 性能分析會話 ,VisualVM 會檢測應用程序所有的被調用的方法。當進入一個方法時,線程會發出一個“method entry”的事件,當退出方法時同樣會發出一個“method exit”的事件,這些事件都包含了時間戳。然后 VisualVM 會把每個被調用方法的總的執行時間和調用的次數按照運行時長展示出來。

image

 

線程分析

在 VisualVM 的監視標簽內,我們可以查看當前應用程序中所有活動線程和守護線程的數量等實時信息。

image

 

線程標簽的時間線視圖上方的工具欄提供了縮小,放大和自適應三個按鈕,以及一個下拉框,我們可以選擇將所有線程、活動線程或者完成的線程顯示在視圖中。

image

 

快照功能

我們可以使用 VisualVM 的快照功能生成任意個性能分析快照並保存到本地來輔助我們進行性能分析。快照為捕獲應用程序性能分析數據提供了一個很便捷的方式因為快照一旦生成可以在任何時候離線打開和查看,也可以相互傳閱。

Profiler 快照

Profiler 快照:當有一個性能分析會話(內存或者 CPU)正在進行時,我們可以通過性能分析結果工具欄的“快照”按鈕生成 Profiler 快照捕獲當時的性能分析數據。

image

產生的快照

image

應用程序快照

應用程序快照:我們可以右鍵點擊左側 Applications 窗口中應用程序節點,選擇“應用程序快照”為生成一個應用程序快照。應用程序快照會收集某一時刻的堆轉儲,線程轉儲和 Profiler 快照,同時也會捕獲 JVM 的一些基本信息。

image

 

轉存功能

線程轉存的生成和分析

VisualVM 能夠對正在運行的本地應用程序生成線程轉儲,把活動線程的堆棧蹤跡打印出來,幫助我們有效了解線程運行的情況,診斷死鎖、應用程序癱瘓等問題。

image

生成的信息:

image

堆轉存的生成和分析

VisualVM 能夠生成堆轉儲,統計某一特定時刻 JVM 中的對象信息,幫助我們分析對象的引用關系、是否有內存泄漏情況的發生等。

image

當 VisualVM 統計完堆內對象數據后,會把堆轉儲信息顯示在新的堆轉儲標簽內,我們可以看到摘要、類、實例數等信息以及通過 OQL 控制台執行查詢語句功能。

堆轉儲的摘要包括轉儲的文件大小、路徑等基本信息,運行的系統環境信息,也可以顯示所有的線程信息。

image

堆轉儲的類視圖

從類視圖可以獲得各個類的實例數和占用堆大小數,分析出內存空間的使用情況,找出內存的瓶頸,避免內存的過度使用。

image

通過實例數視圖可以獲得每個實例內部各成員變量的值以及該實例被引用的位置。首先需要在類視圖選擇需要查看實例的類。

image

 

image

 

此外,還能對兩個堆轉儲文件進行比較。通過比較我們能夠分析出兩個時間點哪些對象被大量創建或銷毀。

image

 

線程轉儲和堆轉儲均可以另存成文件,以便進行離線分析。

image

 

參考資料:

使用 VisualVM 進行性能分析及調優
https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM