VisualVM 是一款免費的性能分析工具。它通過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運行時獲得實時數據,從而進行動態的性能分析。
VisualVM 窗口
在啟動 VisualVM 后,將打開 VisualVM 主窗口。VisualVM 主窗口分為兩個窗口。
首次啟動 VisualVM 時,“應用程序”窗口顯示在主窗口的左側,“起始頁”顯示在主窗口的右側?!捌鹗柬摗卑赶?VisualVM 文檔 Web 頁和其他資源的鏈接。
注意:缺省情況下,每次啟動 VisualVM 時都將打開“起始頁”。通過從主菜單中選擇“幫助”>“起始頁”,可以隨時打開“起始頁”。此外,還可以通過取消選中“啟動時顯示”復選框隱藏“起始頁”。
“應用程序”窗口
啟動應用程序后,將在 VisualVM 主窗口的左側打開“應用程序”窗口?!皯贸绦颉贝翱谑菫g覽正在運行的應用程序詳細信息的主入口點?!皯贸绦颉贝翱诓捎脴浣Y構,以便您可以快速查看本地計算機和任何已連接的遠程計算機上運行的應用程序。您還可以從“應用程序”窗口中訪問核心 dump (Solaris/Linux) 和保存的快照。
右鍵單擊“應用程序”窗口中的某個節點將打開一個彈出式菜單,通過該菜單可以執行與該節點相關的操作,其中包括打開應用程序標簽、生成堆 dump 和線程 dump,以及在主窗口中打開快照。
主窗口
主窗口中顯示有關應用程序的詳細信息。在查看有關應用程序的數據時,主窗口中的每個標簽表示一個應用程序,這使您可以輕松查看和導航數據。保存的線程 dump 和堆 dump 也可以在主窗口中打開。
VisualVM 插件
通過使用“插件”管理器安裝由“VisualVM 插件中心”提供的插件,可以向 VisualVM 添加功能。您也可以開發自己的插件,然后將其添加到更新中心來擴展 VisualVM 的功能。
例如,安裝 VisualVM-MBeans 插件可以向應用程序標簽中添加 "MBeans" 標簽,通過此標簽,可以在 VisualVM 內監視和管理 MBeans。
安裝 VisualVM 插件:
從主菜單中選擇“工具”>“插件”。
在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。
逐步完成插件安裝程序。
VisualVM 安裝
VisualVM 是一個性能分析工具,自從 JDK 6 Update 7 以后已經作為 Oracle JDK 的一部分,位于 JDK 根目錄的 bin 文件夾下。VisualVM 自身要在 JDK6 以上的版本上運行,但是它能夠監控 JDK1.4 以上版本的應用程序。下面主要介紹如何安裝 VisualVM 以及各種 VisualVM 上的插件。
安裝 VisualVM
VisualVM 項目的官方網站目前提供英文版本和多語言支持版本下載。多語言版本主要支持英語、日語以及中文三種語言。如果下載安裝多語言版本的 VisualVM,安裝程序會依據操作系統的當前語言環境去安裝相應 VisualVM 的語言版本。最新 VisualVM 版本主要支持的操作系統包括:Microsoft Windows (7, Vista, XP, Server)、Linux、Sun Solaris、Mac OS X、HP-UX 11i。本文以 Microsoft Windows XP 為安裝環境并支持中文。
從 VisualVM 項目的官方網站上下載 VisualVM 安裝程序。
將 VisualVM 安裝程序解壓縮到本地系統。
導航至 VisualVM 安裝目錄的 bin 目錄,然后啟動 jvisualvm.exe。
安裝 VisualVM 上的插件
VisualVM 插件中心提供很多插件以供安裝向 VisualVM 添加功能??梢酝ㄟ^ VisualVM 應用程序安裝,或者從 VisualVM 插件中心手動下載插件,然后離線安裝。另外,用戶還可以通過下載插件分發文件 (.nbm 文件 ) 安裝第三方插件為 VisualVM 添加功能。
從 VisualVM 插件中心安裝插件安裝步驟 :
從主菜單中選擇“工具”>“插件”。
在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。
逐步完成插件安裝程序。
圖 1. VisualVM 插件管理器
根據 .nbm 文件安裝第三方插件安裝步驟 :
從主菜單中選擇“工具”>“插件”。
在“已下載”標簽中,點擊"添加插件"按鈕,選擇已下載的插件分發文件 (.nbm) 并打開。
選中打開的插件分發文件,并單擊"安裝"按鈕,逐步完成插件安裝程序。
圖 2. 通過 .nbm 文件安裝 VisualVM 插件
功能介紹
下面我們將介紹性能分析的幾種常見方式以及如何使用 VisualVM 性能分析工具進行分析。
內存分析
VisualVM 通過檢測 JVM 中加載的類和對象信息等幫助我們分析內存使用情況,我們可以通過 VisualVM 的監視標簽和 Profiler 標簽對應用程序進行內存分析。
在監視標簽內,我們可以看到實時的應用程序內存堆以及永久保留區域的使用情況。
圖 3. 內存堆使用情況
圖 4. 永久保留區域使用情況
此外,我們也可以通過 Applications 窗口右擊應用程序節點來啟用“在出現 OOME 時生成堆 Dump”功能,當應用程序出現 OutOfMemory 例外時,VisualVM 將自動生成一個堆轉儲。
圖 5. 開啟“在出現 OOME 時生成堆”功能
在 Profiler 標簽,點擊“內存”按鈕將啟動一個內存分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果。通過內存性能分析結果,我們可以查看哪些對象占用了較多的內存,存活的時間比較長等,以便做進一步的優化。
此外,我們可以通過性能分析結果下方的類名過濾器對分析結果進行過濾。
圖 6. 內存分析結果
CPU 分析
VisualVM 能夠監控應用程序在一段時間的 CPU 的使用情況,顯示 CPU 的使用率、方法的執行效率和頻率等相關數據幫助我們發現應用程序的性能瓶頸。我們可以通過 VisualVM 的監視標簽和 Profiler 標簽對應用程序進行 CPU 性能分析。
在監視標簽內,我們可以查看 CPU 的使用率以及垃圾回收活動對性能的影響。過高的 CPU 使用率可能是由于我們的項目中存在低效的代碼,可以通過 Profiler 標簽的 CPU 性能分析功能進行詳細的分析。如果垃圾回收活動過于頻繁,占用了較高的 CPU 資源,可能是由內存不足或者是新生代和舊生代分配不合理導致的等。
圖 7. CPU 使用情況
在 Profiler 標簽,點擊“CPU”按鈕啟動一個 CPU 性能分析會話 ,VisualVM 會檢測應用程序所有的被調用的方法。當進入一個方法時,線程會發出一個“method entry”的事件,當退出方法時同樣會發出一個“method exit”的事件,這些事件都包含了時間戳。然后 VisualVM 會把每個被調用方法的總的執行時間和調用的次數按照運行時長展示出來。
此外,我們也可以通過性能分析結果下方的方法名過濾器對分析結果進行過濾。
圖 8. CPU 性能分析結果
線程分析
Java 語言能夠很好的實現多線程應用程序。當我們對一個多線程應用程序進行調試或者開發后期做性能調優的時候,往往需要了解當前程序中所有線程的運行狀態,是否有死鎖、熱鎖等情況的發生,從而分析系統可能存在的問題。
在 VisualVM 的監視標簽內,我們可以查看當前應用程序中所有活動線程和守護線程的數量等實時信息。
圖 9. 活躍線程情況
VisualVM 的線程標簽提供了三種視圖,默認會以時間線的方式展現。另外兩種視圖分別是表視圖和詳細信息視圖。
時間線視圖上方的工具欄提供了縮小,放大和自適應三個按鈕,以及一個下拉框,我們可以選擇將所有線程、活動線程或者完成的線程顯示在視圖中。
圖 10. 線程時間線視圖
圖 11. 線程表視圖
我們在詳細信息視圖中不但可以查看所有線程、活動線程和結束的線程的詳細數據,而且也可以查看某個線程的詳細情況。
圖 12. 線程詳細視圖
快照功能
我們可以使用 VisualVM 的快照功能生成任意個性能分析快照并保存到本地來輔助我們進行性能分析??煺諡椴东@應用程序性能分析數據提供了一個很便捷的方式因為快照一旦生成可以在任何時候離線打開和查看,也可以相互傳閱。
VisualVM 提供了兩種類型的快照:
Profiler 快照:當有一個性能分析會話(內存或者 CPU)正在進行時,我們可以通過性能分析結果工具欄的“快照”按鈕生成 Profiler 快照捕獲當時的性能分析數據。
圖 13. Profiler 快照
應用程序快照:我們可以右鍵點擊左側 Applications 窗口中應用程序節點,選擇“應用程序快照”為生成一個應用程序快照。應用程序快照會收集某一時刻的堆轉儲,線程轉儲和 Profiler 快照,同時也會捕獲 JVM 的一些基本信息。
圖 14. 應用程序快照
轉儲功能
線程轉儲的生成與分析
VisualVM 能夠對正在運行的本地應用程序生成線程轉儲,把活動線程的堆棧蹤跡打印出來,幫助我們有效了解線程運行的情況,診斷死鎖、應用程序癱瘓等問題。
圖 15. 線程標簽及線程轉儲功能
當 VisualVM 統計完應用程序內線程的相關數據,會把這些信息顯示新的線程轉儲標簽。
圖 16. 線程轉儲結果
堆轉儲的生成與分析
VisualVM 能夠生成堆轉儲,統計某一特定時刻 JVM 中的對象信息,幫助我們分析對象的引用關系、是否有內存泄漏情況的發生等。
圖 17. 監視標簽及堆轉儲功能
當 VisualVM 統計完堆內對象數據后,會把堆轉儲信息顯示在新的堆轉儲標簽內,我們可以看到摘要、類、實例數等信息以及通過 OQL 控制臺執行查詢語句功能。
堆轉儲的摘要包括轉儲的文件大小、路徑等基本信息,運行的系統環境信息,也可以顯示所有的線程信息。
圖 18. 堆轉儲的摘要視圖
從類視圖可以獲得各個類的實例數和占用堆大小數,分析出內存空間的使用情況,找出內存的瓶頸,避免內存的過度使用。
圖 19. 堆轉儲的類視圖
通過實例數視圖可以獲得每個實例內部各成員變量的值以及該實例被引用的位置。首先需要在類視圖選擇需要查看實例的類。
圖 20. 選擇查詢實例數的類
圖 21. 實例數視圖
此外,還能對兩個堆轉儲文件進行比較。通過比較我們能夠分析出兩個時間點哪些對象被大量創建或銷毀。
圖 22. 堆轉儲的比較
圖 23. 堆轉儲的比較結果
線程轉儲和堆轉儲均可以另存成文件,以便進行離線分析。
圖 24. 轉儲文件的導出
總結
本文首先簡要列舉了一些性能分析相關的背景知識。然后介紹了 VisualVM 的下載和安裝。最后從內存性能、CPU 性能、快照功能以及轉儲功能四個方面展開,進一步說明了如何使用 VisualVM 進行性能分析。通過本文的介紹,相信讀者對性能分析會有一定的了解,并可以利用 VisualVM 進行性能分析。