使用jvisualvm配合Visual GC插件監(jiān)控Java程序詳細(xì)總結(jié)
jvisualvm介紹
VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序,它提供了運(yùn)行監(jiān)視、故障處理、性能分析(Profiling)等功能。VisuaIVM有一個很大的優(yōu)點:不需要被監(jiān)視的程序基于特殊Agent運(yùn)
行,因此它對應(yīng)用程序的實際性能的影響很小,使得它可以直接應(yīng)用在生產(chǎn)環(huán)境中。
jdk8的文檔中https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html就有jvisualvm的使用介紹,
jvisualvm的官網(wǎng)介紹地址為:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html 。
VisualVM基于NetBeans平臺開發(fā),因此它一開始就具備了插件擴(kuò)展功能的特性,通過插件擴(kuò)展支持,visualVM可以做到:
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置、環(huán)境信息(jps、jinfo)。
- 監(jiān)視應(yīng)用程序的CPU、GC、堆、方法區(qū)以及線程的信息(jstat、jstack)。
- dump以及分析堆轉(zhuǎn)儲快照(jmap、jhat)·
- 方法級的程序運(yùn)行性能分析,找出被調(diào)用最多、運(yùn)行時間最長的方法。
- 離線程序快照:收集程序的運(yùn)行時配置、線程dump、內(nèi)存dump等信息建立一個快照,可以將快照發(fā)送開發(fā)者處進(jìn)行Bug反饋。
- 其他plugins的無限的可能性(常用的Visual GC,BTrace,Threads Inspector )……
VisualvM可以監(jiān)控本地和遠(yuǎn)程的Java應(yīng)用程序,可能會有部分功能在監(jiān)控遠(yuǎn)程應(yīng)用程序時無法使用。在jdk安裝目錄\bin的命令中找到j(luò)visualvm.exe雙擊打開即可使用。
jvisualvm使用介紹
打開jvisualvm后,可以看到如下界面,其可以監(jiān)控本地和遠(yuǎn)程的Java應(yīng)用程序,圖中紅框圈住的是本地程序,左側(cè)顯示的com.wkp.jvm.ServiceapiApplication (pid 8700)其實相當(dāng)于 jps -l 命令的輸出。可以看到有概述、監(jiān)視、線程、抽樣器和Profiler這幾個功能菜單,而Visual GC是添加的插件,默認(rèn)是沒有的(下面會介紹這個插件)。
1、概述里面顯示了JDK的版本、PID、JVM參數(shù)、系統(tǒng)屬性等(相當(dāng)于java -version,jps,jinfo等命令)。
Java應(yīng)用程序如果想能夠遠(yuǎn)程連接監(jiān)控,可以通過JMX和jstatd,如果使用JMX則啟動時要添加JMX相關(guān)的參數(shù)(具體的遠(yuǎn)程連接感興趣的話,可以自己找文章看一下哈):
nohup java -jar -Djava.rmi.server.hostname=192.168.74.4 -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false test.jar &
2、監(jiān)視菜單,可以看到如下界面:展示了CPU使用情況、堆內(nèi)存大小及占用情況、類的裝載和線程情況。點擊堆Dump按鈕會生成堆dump文件,相當(dāng)于jmap命令。
雙擊打開上面生成的dump文件,可以看到如下所示:點擊顯示線程信息會看到線程dump信息(跟jstack命令輸出的一樣),然后還有類、實例數(shù)和OQL控制臺,這個和前面介紹的MAT類似。
點擊類按鈕,會看到如下所示:可以看到類的實例數(shù)、大小等,還有一個重要功能"與另一個堆存儲進(jìn)行比較",
可以在執(zhí)行GC前后分別產(chǎn)生堆dump文件,然后進(jìn)行對比分析哪些對象有了變化、是如何變化的。
3、線程菜單, 可以看到所有的線程信息:線程數(shù)量、線程狀態(tài)、線程名稱、線程運(yùn)行時間等,點擊線程Dump按鈕會跟jstack命令一樣生成線程dump文件。
4、抽樣器菜單,點擊“CPU”按鈕啟動一個 CPU 性能分析會話 ,VisualVM 會檢測應(yīng)用程序所有的被調(diào)用的方法。當(dāng)進(jìn)入一個方法時,線程會發(fā)出一個“method entry”的事件,當(dāng)退出方法時同樣會發(fā)出一個“method exit”的事件,這些事件都包含了時間戳。然后 VisualVM 會把每個被調(diào)用方法的總的執(zhí)行時間和調(diào)用的次數(shù)按照運(yùn)行時長展示出來。
此外,我們也可以通過性能分析結(jié)果下方的方法名過濾器對分析結(jié)果進(jìn)行過濾。
點擊抽樣器中的內(nèi)存會看Java程序中的類的實例數(shù)、線程分配的內(nèi)存等信息。
5、Profiler分析器:跟上面的抽樣器類似,也可以選擇CPU或者內(nèi)存進(jìn)行監(jiān)控,這里就不貼圖了。
如果你是通過雙擊jvisualvm.exe打開的,則在你點擊Profiler中的CPU或者內(nèi)存的時候會出現(xiàn) VisualVm的Profiler一直轉(zhuǎn)圈:正在連接到目標(biāo)VM,解決方式就是通過命令啟動,并且添加啟動參數(shù)即可解決。
jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true //-J即表示JVM OPTION:允許帶JVM參數(shù)啟動
C:\Program Files\java8\jdk1.8.0_112\bin>jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true
點擊Profiler中的CPU會顯示方法的執(zhí)行時間、調(diào)用次數(shù)等
點擊Profiler中的內(nèi)存會對內(nèi)存進(jìn)行分析,會顯示分配的對象,對象的大小,對象的年齡等信息。
Visual GC插件安裝及使用
jvisulaVM如何添加插件:https://visualvm.github.io/index.html,visual GC插件下載地址為:https://visualvm.github.io/pluginscenters.html,根據(jù)自己的jdk版本選擇對應(yīng)的插件版本,并復(fù)制插件下載鏈接
點擊VisualVm的工具->插件,開始的時候可能可用插件顯示為0,可用在設(shè)置里面添加,把上面的鏈接地址復(fù)制進(jìn)去,確定之后可用插件列表里面就可以看到了。在可用插件列表中選中,然后點擊安裝,安裝完成后重啟即可看到Visual GC插件。
打開Visual GC插件可以看到整個區(qū)域分為三部分:spaces、graphs、histogram
1,spaces區(qū)域:代表虛擬機(jī)內(nèi)存分布情況。從圖中可以看出,虛擬機(jī)被分為Metaspace、Old、Eden、S0、S1
2,Graphs區(qū)域:內(nèi)存使用詳細(xì)介紹
- Compile Time(編譯時間):圖中顯示編譯了4070個類總耗時14.026s,一個駝峰表示一次JIT編譯,越窄表示時間越短
- Class Loader Time(類加載時間):表示加載、卸載類的數(shù)量、總消耗時間
- GC Time(GC Time):顯示GC次數(shù)、耗時、最近垃圾收集的原因
- Eden Space(Eden 區(qū)):括號內(nèi)的8.500M表示最大容量,8.500M表示當(dāng)前容量,后面的2.259M表示當(dāng)前占用空間,42 collections表示垃圾收集次數(shù),239.693ms表示垃圾收集花費時間
- Survivor 0/Survivor 1(S0和S1區(qū)):和Eden Space類似
- Old Gen(老年代):和Eden Space類似
- Metaspace(元空間):表示最大空間、當(dāng)前空間、當(dāng)前占用大小。
3,histogram:顯示survivor區(qū)域?qū)ο蟮哪挲g
Visual GC的histogram可能會顯示不受此JVM支持,因為是垃圾收集器的原因,Java應(yīng)用默認(rèn)使用UseParallelGC 并行收集器,這時候是不顯示的,不用并行收集器就可以了,例如改為CMS+Parnew就能正常顯示。
- Tenuring Threshold:表示新生代年齡大于當(dāng)前值則進(jìn)入老年代
- Max Tenuring Threshold:表示新生代最大年齡值。
- Tenuring Threshold與Max Tenuring Threshold區(qū)別:Max Tenuring Threshold是一個最大限定,所有的新生代年齡都不能超過當(dāng)前值,而Tenuring Threshold是個動態(tài)計算出來的臨時值,一般情況與Max Tenuring Threshold相等,如果在Suivivor空間中,相同年齡所有對象大小的總和大于Survivor空間的一半,則年齡大于或者等于該年齡的對象就都可以直接進(jìn)入老年代(如果計算出來年齡段是6,則Tenuring Threshold=6,age>=6的Suivivor對象都符合要求),它才是新生代是否進(jìn)入老年代判斷的依據(jù)。
- Desired Survivor Size:Survivor空間大小驗證闕值(默認(rèn)是survivor空間的一半),用于Tenuring Threshold判斷對象是否提前進(jìn)入老年代。
- Current Survivor Size:當(dāng)前survivor空間大小
到此這篇關(guān)于使用jvisualvm配合Visual GC插件監(jiān)控Java程序詳細(xì)總結(jié)的文章就介紹到這了,更多相關(guān)jvisualvm 配合 Visual GC監(jiān)控Java程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何在線程中獲取@Service Bean類
這篇文章主要介紹了SpringBoot如何在線程中獲取@Service Bean類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java實現(xiàn)樹形結(jié)構(gòu)管理的組合設(shè)計模式
Java組合模式是一種結(jié)構(gòu)型設(shè)計模式,它允許將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合模式使得用戶可以使用統(tǒng)一的方式處理單個對象和對象組合,從而簡化了系統(tǒng)的設(shè)計和維護(hù)2023-04-04