jvisualvm介紹
VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序,它提供了運(yùn)行監(jiān)視、故障處理、性能分析(Profiling)等功能。VisuaIVM有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的程序基于特殊Agent運(yùn)
行,因此它對(duì)應(yīng)用程序的實(shí)際性能的影響很小,使得它可以直接應(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平臺(tái)開(kāi)發(fā),因此它一開(kāi)始就具備了插件擴(kuò)展功能的特性,通過(guò)插件擴(kuò)展支持,visualVM可以做到:
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置、環(huán)境信息(jps、jinfo)。
- 監(jiān)視應(yīng)用程序的CPU、GC、堆、方法區(qū)以及線程的信息(jstat、jstack)。
- dump以及分析堆轉(zhuǎn)儲(chǔ)快照(jmap、jhat)?
- 方法級(jí)的程序運(yùn)行性能分析,找出被調(diào)用最多、運(yùn)行時(shí)間最長(zhǎng)的方法。
- 離線程序快照:收集程序的運(yùn)行時(shí)配置、線程dump、內(nèi)存dump等信息建立一個(gè)快照,可以將快照發(fā)送開(kāi)發(fā)者處進(jìn)行Bug反饋。
- 其他plugins的無(wú)限的可能性(常用的Visual GC,BTrace,Threads Inspector )……
VisualvM可以監(jiān)控本地和遠(yuǎn)程的Java應(yīng)用程序,可能會(huì)有部分功能在監(jiān)控遠(yuǎn)程應(yīng)用程序時(shí)無(wú)法使用。在jdk安裝目錄in的命令中找到j(luò)visualvm.exe雙擊打開(kāi)即可使用。
jvisualvm使用介紹
打開(kāi)jvisualvm后,可以看到如下界面,其可以監(jiān)控本地和遠(yuǎn)程的Java應(yīng)用程序,圖中紅框圈住的是本地程序,左側(cè)顯示的com.wkp.jvm.ServiceapiApplication (pid 8700)其實(shí)相當(dāng)于 jps -l 命令的輸出。可以看到有概述、監(jiān)視、線程、抽樣器和Profiler這幾個(gè)功能菜單,而Visual GC是添加的插件,默認(rèn)是沒(méi)有的(下面會(huì)介紹這個(gè)插件)。
1、概述里面顯示了JDK的版本、PID、JVM參數(shù)、系統(tǒng)屬性等(相當(dāng)于java -version,jps,jinfo等命令)。
Java應(yīng)用程序如果想能夠遠(yuǎn)程連接監(jiān)控,可以通過(guò)JMX和jstatd,如果使用JMX則啟動(dòng)時(shí)要添加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)存大小及占用情況、類的裝載和線程情況。點(diǎn)擊堆Dump按鈕會(huì)生成堆dump文件,相當(dāng)于jmap命令。
雙擊打開(kāi)上面生成的dump文件,可以看到如下所示:點(diǎn)擊顯示線程信息會(huì)看到線程dump信息(跟jstack命令輸出的一樣),然后還有類、實(shí)例數(shù)和OQL控制臺(tái),這個(gè)和前面介紹的MAT類似。
點(diǎn)擊類按鈕,會(huì)看到如下所示:可以看到類的實(shí)例數(shù)、大小等,還有一個(gè)重要功能"與另一個(gè)堆存儲(chǔ)進(jìn)行比較",
可以在執(zhí)行GC前后分別產(chǎn)生堆dump文件,然后進(jìn)行對(duì)比分析哪些對(duì)象有了變化、是如何變化的。
3、線程菜單, 可以看到所有的線程信息:線程數(shù)量、線程狀態(tài)、線程名稱、線程運(yùn)行時(shí)間等,點(diǎn)擊線程Dump按鈕會(huì)跟jstack命令一樣生成線程dump文件。
4、抽樣器菜單,點(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ò)濾。
點(diǎn)擊抽樣器中的內(nèi)存會(huì)看Java程序中的類的實(shí)例數(shù)、線程分配的內(nèi)存等信息。
5、Profiler分析器:跟上面的抽樣器類似,也可以選擇CPU或者內(nèi)存進(jìn)行監(jiān)控,這里就不貼圖了。
如果你是通過(guò)雙擊jvisualvm.exe打開(kāi)的,則在你點(diǎn)擊Profiler中的CPU或者內(nèi)存的時(shí)候會(huì)出現(xiàn) VisualVm的Profiler一直轉(zhuǎn)圈:正在連接到目標(biāo)VM,解決方式就是通過(guò)命令啟動(dòng),并且添加啟動(dòng)參數(shù)即可解決。
jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true //-J即表示JVM OPTION:允許帶JVM參數(shù)啟動(dòng)
C:Program Filesjava8jdk1.8.0_112in>jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true
點(diǎn)擊Profiler中的CPU會(huì)顯示方法的執(zhí)行時(shí)間、調(diào)用次數(shù)等
點(diǎn)擊Profiler中的內(nèi)存會(huì)對(duì)內(nèi)存進(jìn)行分析,會(huì)顯示分配的對(duì)象,對(duì)象的大小,對(duì)象的年齡等信息。
Visual GC插件安裝及使用
jvisulaVM如何添加插件:https://visualvm.github.io/index.html,visual GC插件下載地址為:https://visualvm.github.io/pluginscenters.html,根據(jù)自己的jdk版本選擇對(duì)應(yīng)的插件版本,并復(fù)制插件下載鏈接
點(diǎn)擊VisualVm的工具->插件,開(kāi)始的時(shí)候可能可用插件顯示為0,可用在設(shè)置里面添加,把上面的鏈接地址復(fù)制進(jìn)去,確定之后可用插件列表里面就可以看到了。在可用插件列表中選中,然后點(diǎn)擊安裝,安裝完成后重啟即可看到Visual GC插件。
打開(kāi)Visual GC插件可以看到整個(gè)區(qū)域分為三部分:spaces、graphs、histogram
1,spaces區(qū)域:代表虛擬機(jī)內(nèi)存分布情況。從圖中可以看出,虛擬機(jī)被分為Metaspace、Old、Eden、S0、S1
2,Graphs區(qū)域:內(nèi)存使用詳細(xì)介紹
- Compile Time(編譯時(shí)間):圖中顯示編譯了4070個(gè)類總耗時(shí)14.026s,一個(gè)駝峰表示一次JIT編譯,越窄表示時(shí)間越短
- Class Loader Time(類加載時(shí)間):表示加載、卸載類的數(shù)量、總消耗時(shí)間
- GC Time(GC Time):顯示GC次數(shù)、耗時(shí)、最近垃圾收集的原因
- Eden Space(Eden 區(qū)):括號(hào)內(nèi)的8.500M表示最大容量,8.500M表示當(dāng)前容量,后面的2.259M表示當(dāng)前占用空間,42 collections表示垃圾收集次數(shù),239.693ms表示垃圾收集花費(fèi)時(shí)間
- 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可能會(huì)顯示不受此JVM支持,因?yàn)槭抢占鞯脑颍琂ava應(yīng)用默認(rèn)使用UseParallelGC 并行收集器,這時(shí)候是不顯示的,不用并行收集器就可以了,例如改為CMS+Parnew就能正常顯示。
- Tenuring Threshold:表示新生代年齡大于當(dāng)前值則進(jìn)入老年代
- Max Tenuring Threshold:表示新生代最大年齡值。
- Tenuring Threshold與Max Tenuring Threshold區(qū)別:Max Tenuring Threshold是一個(gè)最大限定,所有的新生代年齡都不能超過(guò)當(dāng)前值,而Tenuring Threshold是個(gè)動(dòng)態(tài)計(jì)算出來(lái)的臨時(shí)值,一般情況與Max Tenuring Threshold相等,如果在Suivivor空間中,相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,則年齡大于或者等于該年齡的對(duì)象就都可以直接進(jìn)入老年代(如果計(jì)算出來(lái)年齡段是6,則Tenuring Threshold=6,age>=6的Suivivor對(duì)象都符合要求),它才是新生代是否進(jìn)入老年代判斷的依據(jù)。
- Desired Survivor Size:Survivor空間大小驗(yàn)證闕值(默認(rèn)是survivor空間的一半),用于Tenuring Threshold判斷對(duì)象是否提前進(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)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/u012988901/article/details/102517829