jvisualvm已經被集成在jdk1.6以上的版本中(不是jre)。自身運行需要最低jdk1.6版本,但是可以監控運行在jdk1.4以上版本的Java程序
以jdk1.7.0_79自帶的jvisualvm來做說明,當然也可單獨下載獨立的jvisualvm,正常安裝完jdk後,至jdk的bin目錄下,運行jvisualvm.exe即可
在jdk目錄下的bin目錄中可以找到jvisualvm.exe文件、直接啟動可以看到如下界面:
以上是已經連接遠程的界面。直觀的監控界面、更有助於我們分析tomcat的運行情況。
下面主要介紹下怎麼樣使用本地jvisualvm監控遠程tomcat。
下面是我的配置方法:
在tomcat/bin目錄下打開startup.sh或者startup.bat,在最後一行前面加上,也就是:
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,可以看到虛擬機內存各個區的使用情況