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