VisualVM是一款集成了多個JDK命令行的可視化工具,可以有效地對JAVA應用程序進行性能分析、優(yōu)化以及調(diào)整等操作。通常來說都用來對JAVA應用程序做性能分析和調(diào)優(yōu),內(nèi)存優(yōu)化、CPU分析、線程分析、快照分析、轉(zhuǎn)儲分析等多項非常強而有效的功能,它還支持在MBeans上進行瀏覽和操作,有需要用到這款VisualVM java調(diào)優(yōu)工具的用戶快快前來獲取吧!

安裝方法
VisualVM 是一個性能分析工具,自從 JDK 6 Update 7 以后已經(jīng)作為 Oracle JDK 的一部分,位于 JDK 根目錄的 bin 文件夾下。VisualVM 自身要在 JDK6 以上的版本上運行,但是它能夠監(jiān)控 JDK1.4 以上版本的應用程序。下面主要介紹如何安裝 VisualVM 以及各種 VisualVM 上的插件。
一、安裝VisualVM
1、將 VisualVM 安裝程序解壓縮到本地系統(tǒng)。
2、導航至 VisualVM 安裝目錄的 bin 目錄,然后啟動 jvisualvm.exe。
二、安裝 VisualVM 上的插件
VisualVM 插件中心提供很多插件以供安裝向 VisualVM 添加功能??梢酝ㄟ^ VisualVM 應用程序安裝,或者從 VisualVM 插件中心手動下載插件,然后離線安裝。另外,用戶還可以通過下載插件分發(fā)文件 (.nbm 文件 ) 安裝第三方插件為 VisualVM 添加功能。
1、VisualVM 插件中心安裝插件安裝步驟 :
從主菜單中選擇“工具”>“插件”。
在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。

逐步完成插件安裝程序。
2、從主菜單中選擇“工具”>“插件”。
在“已下載”標簽中,點擊"添加插件"按鈕,選擇已下載的插件分發(fā)文件 (.nbm) 并打開。

選中打開的插件分發(fā)文件,并單擊"安裝"按鈕,逐步完成插件安裝程序。
VisualVM功能
一、性能分析的主要方式
1.監(jiān)視:監(jiān)視是一種用來查看應用程序運行時行為的一般方法。通常會有多個KKX視圖(View)分別實時地顯示 CPU 使用情況、內(nèi)存使用情況、線程狀態(tài)以及其他一些有用的信息,以便用戶能很快地發(fā)現(xiàn)問題的關鍵所在。
2.轉(zhuǎn)儲:性能分析工具從內(nèi)存中獲得當前狀態(tài)數(shù)據(jù)并存儲到文件用于靜態(tài)的性能分析。Java 程序是通過在啟動 Java 程序時添加適當?shù)臈l件參數(shù)來觸發(fā)轉(zhuǎn)儲操作的。它包括以下三種:
系統(tǒng)轉(zhuǎn)儲:JVM 生成的本地系統(tǒng)的轉(zhuǎn)儲,又稱作核心轉(zhuǎn)儲。一般的,系統(tǒng)轉(zhuǎn)儲數(shù)據(jù)量大,需要平臺相關的工具去分析,如 Windows 上的 windbg 和 Linux 上的 gdb.
Java 轉(zhuǎn)儲:JVM 內(nèi)部生成的格式化后的數(shù)據(jù),包括線程信息,類的加載信息以及堆的統(tǒng)計數(shù)據(jù)。通常也用于檢測死鎖。
堆轉(zhuǎn)儲:JVM 將所有對象的堆內(nèi)容存儲到文件。
二、快照:
應用程序啟動后,性能分析工具開始收集各種運行時數(shù)據(jù),其中一些數(shù)據(jù)直接顯示在監(jiān)視視圖中,而另外大部分數(shù)據(jù)被保存在內(nèi)部,直到用戶要求獲取快照,基于這些保存的數(shù)據(jù)的統(tǒng)計信息才被顯示出來??煺瞻藨贸绦蛟谝欢螘r間內(nèi)的執(zhí)行信息,通常有 CPU 快照和內(nèi)存快照兩種類型。
CPU 快照:主要包含了應用程序中函數(shù)的調(diào)用關系及運行時間,這些信息通??梢栽?CPU 快照視圖中進行查看。
內(nèi)存快照:主要包含了內(nèi)存的分配和使用情況、載入的所有類、存在的對象信息及對象間的引用關系等。這些信息通??梢栽趦?nèi)存快照視圖中進行查看。
三、性能分析:
性能分析是通過收集程序運行時的執(zhí)行數(shù)據(jù)來幫助開發(fā)人員定位程序需要被優(yōu)化的部分,從而提高程序的運行速度或是內(nèi)存使用效率,主要有以下三個方面:
CPU 性能分析:CPU 性能分析的主要目的是統(tǒng)計函數(shù)的調(diào)用情況及執(zhí)行時間,或者更簡單的情況就是統(tǒng)計應用程序的 CPU 使用情況。通常有 CPU 監(jiān)視和 CPU 快照兩種方式來顯示 CPU 性能分析結(jié)果。
內(nèi)存性能分析:內(nèi)存性能分析的主要目的是通過統(tǒng)計內(nèi)存使用情況檢測可能存在的內(nèi)存泄露問題及確定優(yōu)化內(nèi)存使用的方向。通常有內(nèi)存監(jiān)視和內(nèi)存快照兩種方式來顯示內(nèi)存性能分析結(jié)果。
線程性能分析:線程性能分析主要用于在多線程應用程序中確定內(nèi)存的問題所在。一般包括線程的狀態(tài)變化情況,死鎖情況和某個線程在線程生命期內(nèi)狀態(tài)的分布情況等
VisualVM特色
1、運行內(nèi)存分析
VisualVM根據(jù)檢驗JVM中載入的類和對象信息內(nèi)容等協(xié)助大家分析運行內(nèi)存應用狀況,我們可以根據(jù)VisualVM的監(jiān)控標識和Profiler標簽對應用程序開展運行內(nèi)存分析。
2、CPU分析
VisualVM可以監(jiān)管應用程序在一段時間的CPU的運用狀況,表明CPU的利用率、方式的運行高效率和頻率等有關數(shù)據(jù)信息協(xié)助大家發(fā)覺應用程序的性能短板。我們可以根據(jù)VisualVM的監(jiān)控標識和Profiler標簽對應用程序開展CPU性能分析。
3、進程分析
Java語言可以有效的完成線程同步應用程序。在我們對一個線程同步應用程序開展校準或是開發(fā)設計中后期做性能調(diào)優(yōu)的情況下,通常必須掌握當今程序流程中全部進程的運轉(zhuǎn)情況,是不是有死鎖、熱鎖等情形的產(chǎn)生,進而分析系統(tǒng)軟件很有可能存在的不足。
4、快照分析
我們可以應用VisualVM的快照作用轉(zhuǎn)化成隨意個性能分析快照并存放到當?shù)貋韰f(xié)助大家開展性能分析??煺諡椴东@應用程序性能分析數(shù)據(jù)信息給予了一個很快捷的方法由于快照一旦轉(zhuǎn)化成可以在無論怎樣無網(wǎng)開啟和查詢,還可以互相核稿。
VisualVM給予了二種類別的快照:
Profiler快照:當有一個性能分析對話(運行內(nèi)存或是CPU)正在進行時,我們可以根據(jù)性能分析結(jié)果菜單欄的“快照”按鍵轉(zhuǎn)化成Profiler快照捕獲那時候的性能分析數(shù)據(jù)信息。
應用程序快照:我們可以鼠標右鍵點一下左邊Applications對話框中應用程序連接點,挑選“應用程序快照”為轉(zhuǎn)化成一個應用程序快照。應用程序快照會搜集某一時時刻刻的堆轉(zhuǎn)儲,進程轉(zhuǎn)儲和Profiler快照,與此同時也會捕獲JVM的一些基本資料。
5、轉(zhuǎn)儲作用
進程轉(zhuǎn)儲的產(chǎn)生與分析:VisualVM可以對已經(jīng)運作的當?shù)貞贸绦蜣D(zhuǎn)化成進程轉(zhuǎn)儲,把主題活動進程的局部變量足跡打印出出去,協(xié)助大家合理掌握進程運作的狀況,確診死鎖、應用程序偏癱等問題。
堆轉(zhuǎn)儲的產(chǎn)生與分析:VisualVM可以轉(zhuǎn)化成堆轉(zhuǎn)儲,統(tǒng)計分析某一特殊時時刻刻JVM中的目標信息內(nèi)容,協(xié)助大家分析目標的引入關聯(lián)、是不是有內(nèi)存泄漏狀況的出現(xiàn)等。
更新日志
GH-260: 完全支持在JDK 16上運行并監(jiān)控/描述Java 16進程
GH-262: 增加對蘋果M1的支持
GH-270: 從以前的VisualVM版本導入插件
GH-275: 增加關于啟用模塊的信息
GH-279: 增加保留尺寸計算的部分進度
GH-254: 更新器的品牌效應。
Python的堆棧跟蹤
HeapViewer - 邏輯值增加了Instant, Attributes$Name, FDBigInteger, java.lang.module
HeapViewer - java.util類的邏輯值--集合現(xiàn)在顯示元素的數(shù)量
Gradle的應用識別器
更新了JDK工具的應用識別器
API變更。
GH-282: 在org.graalvm.visualvm.lib.jfluid.heap包的公共API中添加泛型。
GH-283: 增加了從實例中獲取Heap的方法。
修復了Bug。
GH-127: G1GC的最大堆不正確
GH-257: "打開快照失敗。"由于沒有完全讀取壓縮數(shù)據(jù)
GH-263: 保留的大小計算為負數(shù)
GH-268: 檢測VisualVM是否在Eclipse OpenJ9上運行
GH-272: 計算引用時沒有進度條
GH-273: NPE:無法調(diào)用 "java.lang.management.MemoryMXBean.gc()"
GH-274: 邏輯值:'...'被添加到完整的字符串中
GH-276: 缺少已知的阻塞方法
GH-277: 不正確的水平滾動
GH-278:LongBuffer.startReading()處的NPE。
GH-280: 在MacOS上選擇背景顏色不正確
HeapViewer--PythonModule、SourceImpl$Key、InetSocketAddress、BigDecimal的邏輯值固定。
內(nèi)存采樣器--改進了重載下的刷新功能
改進了對IntelliJ應用程序的檢測