jvisualvm能監控內存泄露,跟蹤垃圾回收,執行時內存、cpu分析,線程分析,遠程監控Tomcat等等java
jvisualvm已經被集成在jdk1.6以上的版本中(不是jre)。自身運行須要最低jdk1.6版本,可是能夠監控運行在jdk1.4以上版本的Java程序tomcat
以jdk1.7.0_79自帶的jvisualvm來作說明,固然也可單獨下載獨立的jvisualvm,正常安裝完jdk後,至jdk的bin目錄下,運行jvisualvm.exe便可安全
在jdk目錄下的bin目錄中能夠找到jvisualvm.exe文件、直接啓動能夠看到以下界面:服務器
以上是已經鏈接遠程的界面。直觀的監控界面、更有助於咱們分析tomcat的運行狀況。tcp
下面主要介紹下怎麼樣使用本地jvisualvm監控遠程tomcat。性能
下面是個人配置方法:測試
在tomcat/bin目錄下打開startup.sh或者startup.bat,在最後一行前面加上,也就是:.net
exec "$PRGDIR"/"$EXECUTABLE" start "$@"插件
前面加上線程
export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.10 -Dcom.sun.management.jmxremote.port=10002 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
參數說明:
指定了JMX啓動的代理端口,這個端口就是visualvm要鏈接的端口(10002端口不能被別的程序使用netstat -an|gerp 10002)
Dcom.sun.management.jmxremote.port=10002
指定了JMX是否啓用ssl
Dcom.sun.management.jmxremote.authenticate=false
指定了JMX是否啓用鑑權(須要用戶名,密碼鑑權)
Dcom.sun.management.jmxremote.authenticate=false
指定了服務器主機名
Djava.rmi.server.hostname=192.168.1.10
配置JMX訪問文件 增長下面內容
export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.10 -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access -Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password"
# cd $CATALINA_HOME/conf/
# cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password
# chmod 700 jmxremote.password (必定注意這個文件默認是不可寫的)
# vi $CATALINA_HOME/conf/jmxremote.password
在最下面添加一個用戶(第一個是用戶名 第二個是密碼)
jiu 123456
# chmod 400 jmxremote.password (要求該文件是任何用戶均不可寫的)
# cp $JAVA_HOME/jre/lib/management/jmxremote.access jmxremote.access
# vi jmxremote.access (該文件是對jmx用戶的受權)
到最後一行 將
monitorRole readonly
controlRole readwrite
註釋 更改成
# monitorRole readonly
# controlRole readwrite
而後在最後添加一行
jiu readwrite
# chmod 400 jmxremote.access
若是沒有這一步、使用startup啓動不了tomcat。
按照上述配置、再使用startup.sh啓動tomcat。
這裏特別注意要開放10002本身設置的端口。
打開防火牆,使外部能訪問
/etc/init.d/iptables status
/sbin/iptables -I INPUT -p tcp --dport 100002 -j ACCEPT #開啓10002端口
/etc/rc.d/init.d/iptables save #保存配置
/etc/rc.d/init.d/iptables restart #重啓服務
若是連接不上能夠先關閉防火牆測試一下
/etc/init.d/iptables stop
接下來就是使用jvisualvm來遠程監控tomcat了
右鍵點擊遠程-添加遠程主機-輸入主機ip地址
添加遠程主機以後,點擊遠程主機右鍵-添加jmx鏈接:
彈出登陸框
輸入主機名:端口號,若是配置了用戶名和密碼,請輸入用戶名和密碼。而後點擊肯定。
點擊肯定以後、在遠程主機下會有一個jmx鏈接,打開鏈接,點擊監視tab,能夠看到以下界面了。
在上圖中能夠看到cpu利用率和垃圾回收活動(這個在分析tomcat性能時也很重要)。而後是堆棧使用狀況。下面是類的使用狀況,最後一個是線程活動狀況。
點擊線程tab能夠看到:
上圖能夠很是清晰的看到線程活動狀況,那些線程正在執行,哪些線程正在等待中,以及執行完畢的線程等。
這裏能夠看到每一個線程的狀態,點擊某個線程右鍵能夠查看該線程的詳細狀況:
使用左上角的線程dump按鈕,還能夠看到線程的堆棧狀況,這樣就能夠具體分析線程是在什麼地方進入等待,什麼地方進入休眠,以及什麼地方一直處於執行狀態。這也是一個性能分析利器哦!
監控服務器上的java程序
相較於監控tomcat要麻煩不少,要預先啓動jstatd服務(${java_home}/bin目錄下)
jstatd是一個監控JVM從建立到銷燬過程當中資源佔用狀況並提供遠程監控接口的RMI(Remote Method Invocation,遠程方法調用)服務器程序,它是一個Daemon程序(後臺進程),要保證遠程監控軟件鏈接到本地的話須要jstatd始終保持運行。
jstatd運行須要經過-J-Djava.security.policy=***指定安全策略,所以咱們須要在服務器上創建一個指定安全策略的文件jstatd.all.policy(我放在了${java_home}/bin目錄下),文件內容以下:
[plain] view plain copy
grant codebase "file:/usr/java/jdk1.7.0_79/lib/tools.jar" {
permission java.security.AllPermission;
};
而後使用這個策略文件啓動jstatd服務
[plain] view plain copy
[root@localhost bin]# pwd
/usr/java/jdk1.7.0_79/bin
[root@localhost bin]$ ./jstatd -J-Djava.security.policy=./jstatd.all.policy &
由於監控的過程當中須要jstatd服務一直運行,因此加上了&,若是須要日誌也可以使用:
[plain] view plain copy
./jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.logCalls=true
接下來就能夠在jvisualvm中配置監控該服務器上運行的java程序了,和在jvisualvm中配置監控tomcat服務器的操做過程是同樣的
須要特別注意的是,有時在配置遠程監控java程序的時候jvisualvm會報一個錯誤
點擊查看錯誤詳情:
connection refused to host:127.0.0.1初步判斷和主機名有關係
[plain] view plain copy
[root@localhost bin]# hostname -i
127.0.0.1 [plain] view plain copy
[root@localhost bin]# hostname 192.168.1.10
修改完重啓jstatd服務(網上不少人說要修改主機的/etc/hosts文件,可是我本身測試修改/etc/hosts文件是沒有效果的,必需要修改主機名)
填寫主機名:
這裏要選添加一個jstatd鏈接:
直接選擇默認配置便可(默認使用1099端口):
點擊ok後,168上的全部java程序就會自動列出:
PS:
jvisualvm也是能夠安裝插件的,具體步驟爲tool -> plugin ->aviable plugin,推薦一個很是好用的插件VisualGC
安裝完這個插件後,將會增長新的監控條目Visual GC,能夠看到虛擬機內存各個區的使用狀況