開發大型 Java 應用程序的過程當中不免遇到內存泄露、性能瓶頸等問題,好比文件、網絡、數據庫的鏈接未釋放,未優化的算法等。隨着應用程序的持續運行,可能會形成整個系統運行效率降低,嚴重的則會形成系統崩潰。爲了找出程序中隱藏的這些問題,在項目開發後期每每會使用性能分析工具來對應用程序的性能進行分析和優化。html
VisualVM 是一款免費的性能分析工具。它經過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運行時得到實時數據,從而進行動態的性能分析。同時,它能自動選擇更快更輕量級的技術儘可能減小性能分析對應用程序形成的影響,提升性能分析的精度。java
本文將對 VisualVM 的主要功能逐一介紹並探討如何利用得到的數據進行性能分析及調優。算法
VisualVM 是一個性能分析工具,自從 JDK 6 Update 7 之後已經做爲 Oracle JDK 的一部分,位於 JDK 根目錄的 bin 文件夾下。VisualVM 自身要在 JDK6 以上的版本上運行,可是它可以監控 JDK1.4 以上版本的應用程序。下面主要介紹如何安裝 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 插件中心手動下載插件,而後離線安裝。另外,用戶還能夠經過下載插件分發文件 (.nbm 文件 ) 安裝第三方插件爲 VisualVM 添加功能。多線程
從 VisualVM 插件中心安裝插件安裝步驟 :jvm
根據 .nbm 文件安裝第三方插件安裝步驟 :函數
下面咱們將介紹性能分析的幾種常見方式以及如何使用 VisualVM 性能分析工具進行分析。工具
VisualVM 經過檢測 JVM 中加載的類和對象信息等幫助咱們分析內存使用狀況,咱們能夠經過 VisualVM 的監視標籤和 Profiler 標籤對應用程序進行內存分析。性能
在監視標籤內,咱們能夠看到實時的應用程序內存堆以及永久保留區域的使用狀況。
此外,咱們也能夠經過 Applications 窗口右擊應用程序節點來啓用「在出現 OOME 時生成堆 Dump」功能,當應用程序出現 OutOfMemory 例外時,VisualVM 將自動生成一個堆轉儲。
在 Profiler 標籤,點擊「內存」按鈕將啓動一個內存分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果。經過內存性能分析結果,咱們能夠查看哪些對象佔用了較多的內存,存活的時間比較長等,以便作進一步的優化。
此外,咱們能夠經過性能分析結果下方的類名過濾器對分析結果進行過濾。
VisualVM 可以監控應用程序在一段時間的 CPU 的使用狀況,顯示 CPU 的使用率、方法的執行效率和頻率等相關數據幫助咱們發現應用程序的性能瓶頸。咱們能夠經過 VisualVM 的監視標籤和 Profiler 標籤對應用程序進行 CPU 性能分析。
在監視標籤內,咱們能夠查看 CPU 的使用率以及垃圾回收活動對性能的影響。太高的 CPU 使用率多是因爲咱們的項目中存在低效的代碼,能夠經過 Profiler 標籤的 CPU 性能分析功能進行詳細的分析。若是垃圾回收活動過於頻繁,佔用了較高的 CPU 資源,多是由內存不足或者是新生代和舊生代分配不合理致使的等。
在 Profiler 標籤,點擊「CPU」按鈕啓動一個 CPU 性能分析會話 ,VisualVM 會檢測應用程序全部的被調用的方法。當進入一個方法時,線程會發出一個「method entry」的事件,當退出方法時一樣會發出一個「method exit」的事件,這些事件都包含了時間戳。而後 VisualVM 會把每一個被調用方法的總的執行時間和調用的次數按照運行時長展現出來。
此外,咱們也能夠經過性能分析結果下方的方法名過濾器對分析結果進行過濾。
Java 語言可以很好的實現多線程應用程序。當咱們對一個多線程應用程序進行調試或者開發後期作性能調優的時候,每每須要瞭解當前程序中全部線程的運行狀態,是否有死鎖、熱鎖等狀況的發生,從而分析系統可能存在的問題。
在 VisualVM 的監視標籤內,咱們能夠查看當前應用程序中全部活動線程和守護線程的數量等實時信息。
VisualVM 的線程標籤提供了三種視圖,默認會以時間線的方式展示。另外兩種視圖分別是表視圖和詳細信息視圖。
時間線視圖上方的工具欄提供了縮小,放大和自適應三個按鈕,以及一個下拉框,咱們能夠選擇將全部線程、活動線程或者完成的線程顯示在視圖中。
咱們在詳細信息視圖中不但能夠查看全部線程、活動線程和結束的線程的詳細數據,並且也能夠查看某個線程的詳細狀況。
咱們可使用 VisualVM 的快照功能生成任意個性能分析快照並保存到本地來輔助咱們進行性能分析。快照爲捕獲應用程序性能分析數據提供了一個很便捷的方式由於快照一旦生成能夠在任什麼時候候離線打開和查看,也能夠相互傳閱。
VisualVM 提供了兩種類型的快照:
VisualVM 可以對正在運行的本地應用程序生成線程轉儲,把活動線程的堆棧蹤影打印出來,幫助咱們有效瞭解線程運行的狀況,診斷死鎖、應用程序癱瘓等問題。
當 VisualVM 統計完應用程序內線程的相關數據,會把這些信息顯示新的線程轉儲標籤。
VisualVM 可以生成堆轉儲,統計某一特定時刻 JVM 中的對象信息,幫助咱們分析對象的引用關係、是否有內存泄漏狀況的發生等。
當 VisualVM 統計完堆內對象數據後,會把堆轉儲信息顯示在新的堆轉儲標籤內,咱們能夠看到摘要、類、實例數等信息以及經過 OQL 控制檯執行查詢語句功能。
堆轉儲的摘要包括轉儲的文件大小、路徑等基本信息,運行的系統環境信息,也能夠顯示全部的線程信息。
從類視圖能夠得到各個類的實例數和佔用堆大小數,分析出內存空間的使用狀況,找出內存的瓶頸,避免內存的過分使用。
經過實例數視圖能夠得到每一個實例內部各成員變量的值以及該實例被引用的位置。首先須要在類視圖選擇須要查看實例的類。
此外,還能對兩個堆轉儲文件進行比較。經過比較咱們可以分析出兩個時間點哪些對象被大量建立或銷燬。
線程轉儲和堆轉儲都可以另存成文件,以便進行離線分析。
本文首先簡要列舉了一些性能分析相關的背景知識。而後介紹了 VisualVM 的下載和安裝。最後從內存性能、CPU 性能、快照功能以及轉儲功能四個方面展開,進一步說明了如何使用 VisualVM 進行性能分析。經過本文的介紹,相信讀者對性能分析會有必定的瞭解,並能夠利用 VisualVM 進行性能分析。