Java jvisualvm简要说明
jvisualvm能干什么:監(jiān)控內(nèi)存泄露,跟蹤垃圾回收,執(zhí)行時(shí)內(nèi)存、cpu分析,線程分析...
?
jvisualvm已經(jīng)被集成在jdk1.6以上的版本中(不是jre)。自身運(yùn)行需要最低jdk1.6版本,但是可以監(jiān)控運(yùn)行在jdk1.4以上版本的java程序
以jdk1.6update45(jdk1.6update45自帶的jvisualvm)來做說明,當(dāng)然也可單獨(dú)下載獨(dú)立的jvisualvm,正常安裝完jdk后,至jdk的bin目錄下,運(yùn)行jvisualvm.exe即可
網(wǎng)上有人說jvisualvm對(duì)ntfs的硬盤格式支持的不好(都說不好,也沒說到底哪里不好),反正我用著是挺正常的,不管怎么樣先把解決方式記下來吧
創(chuàng)建jvisualvm.exe的快捷方式,右鍵快捷方式選擇屬性,在“目標(biāo)”欄中追加"-XX:+PerfBypassFileSystemCheck"
程序運(yùn)行后會(huì)自動(dòng)監(jiān)控本機(jī)運(yùn)行的java程序(Local標(biāo)簽下,遠(yuǎn)程服務(wù)器上的java程序需要另行配置),如果是下載的jvisualvm,解壓后,運(yùn)行bin目錄下的jvisualvm.exe即可
?
Local標(biāo)簽下的第一個(gè)VisualVM為jvisualvm對(duì)自身的監(jiān)控,可以看到消耗的資源還是很少的,第二個(gè)為本機(jī)的eclipse
監(jiān)控項(xiàng)總共分為Overview,Monitor,Threads和一個(gè)Sampler。
1.Overview(jvm啟動(dòng)參數(shù),系統(tǒng)參數(shù))
可以看到eclipse的啟動(dòng)參數(shù)
(通過這些啟動(dòng)參數(shù),可以判斷程序是否有內(nèi)存溢出)
?
2.Monitor
左上:cpu利用率,gc狀態(tài)的監(jiān)控
右上:堆利用率,永久內(nèi)存區(qū)的利用率
左下:類的監(jiān)控
右下:線程的監(jiān)控
performGC:gc的詳細(xì)運(yùn)行狀態(tài)
HeapDump:堆的詳細(xì)狀態(tài)(可以看到堆的概況,里面所有的類,還能點(diǎn)進(jìn)具體的一個(gè)類查看這個(gè)類的狀態(tài))
?
3.Threads
能夠顯示線程的名稱和運(yùn)行的狀態(tài),在調(diào)試多線程時(shí)必不可少,而且可以點(diǎn)進(jìn)一個(gè)線程查看這個(gè)線程的詳細(xì)運(yùn)行情況
?
監(jiān)控服務(wù)器上的tomcat
tomcat的配置文件catalina.sh中增加:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.58.164"參數(shù)說明:
指定了JMX啟動(dòng)的代理端口,這個(gè)端口就是visualvm要連接的端口(9998端口不能被別的程序使用netstat -an|gerp 9998) Dcom.sun.management.jmxremote.port=9998 指定了JMX是否啟用ssl Dcom.sun.management.jmxremote.authenticate=false 指定了JMX是否啟用鑒權(quán)(需要用戶名,密碼鑒權(quán)) Dcom.sun.management.jmxremote.authenticate=false 指定了服務(wù)器主機(jī)名 Djava.rmi.server.hostname=192.168.58.164填寫主機(jī)名:
右鍵創(chuàng)建一個(gè)jmx連接:
填寫上端口號(hào)即可:
配置完成:
?
監(jiān)控服務(wù)器上的java程序
相較于監(jiān)控tomcat要麻煩很多,要預(yù)先啟動(dòng)jstatd服務(wù)(${java_home}/bin目錄下)
jstatd是一個(gè)監(jiān)控JVM從創(chuàng)建到銷毀過程中資源占用情況并提供遠(yuǎn)程監(jiān)控接口的RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)服務(wù)器程序,它是一個(gè)Daemon程序(后臺(tái)進(jìn)程),要保證遠(yuǎn)程監(jiān)控軟件連接到本地的話需要jstatd始終保持運(yùn)行。
jstatd運(yùn)行需要通過-J-Djava.security.policy=***指定安全策略,因此我們需要在服務(wù)器上建立一個(gè)指定安全策略的文件jstatd.all.policy(我放在了${java_home}/bin目錄下),文件內(nèi)容如下:
grant codebase "file:/home/123/123/jdk1.5.0_15/lib/tools.jar" { permission java.security.AllPermission; };然后使用這個(gè)策略文件啟動(dòng)jstatd服務(wù)
[123@123 bin]$ pwd /home/123/123/jdk1.5.0_15/bin [123@123 bin]$ ./jstatd -J-Djava.security.policy=./jstatd.all.policy &因?yàn)楸O(jiān)控的過程中需要jstatd服務(wù)一直運(yùn)行,所以加上了&,如果需要日志也可使用:
./jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.logCalls=true接下來就可以在jvisualvm中配置監(jiān)控該服務(wù)器上運(yùn)行的java程序了,和在jvisualvm中配置監(jiān)控tomcat服務(wù)器的操作過程是一樣的
需要特別注意的是,有時(shí)在配置遠(yuǎn)程監(jiān)控java程序的時(shí)候jvisualvm會(huì)報(bào)一個(gè)錯(cuò)誤
點(diǎn)擊查看錯(cuò)誤詳情:
?connection refused to host:127.0.0.1初步判斷和主機(jī)名有關(guān)系
[123@123 bin]# hostname -i 127.0.0.1 [123@123 bin]# hostname 192.168.58.168修改完重啟jstatd服務(wù)(網(wǎng)上很多人說要修改主機(jī)的/etc/hosts文件,但是我自己測(cè)試修改/etc/hosts文件是沒有效果的,必須要修改主機(jī)名)
填寫主機(jī)名:
這里要選添加一個(gè)jstatd連接:
直接選擇默認(rèn)配置即可(默認(rèn)使用1099端口):
點(diǎn)擊ok后,168上的所有java程序就會(huì)自動(dòng)列出:
?
PS:
jvisualvm也是可以安裝插件的,具體步驟為tool -> plugin ->aviable plugin,推薦一個(gè)非常好用的插件VisualGC
安裝完這個(gè)插件后,將會(huì)增加新的監(jiān)控條目Visual GC,可以看到虛擬機(jī)內(nèi)存各個(gè)區(qū)的使用情況
總結(jié)
以上是生活随笔為你收集整理的Java jvisualvm简要说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET文件上传和下载
- 下一篇: VC++ MFC中如何将应用程序的配置