以前做程序很少對程序的運行狀態做監控,今天決定對現在做的這個程序進行一下監控
監視jvm狀態的工具首選當然是jconsole或者JvisualVM,這兩個東西都是jdk自帶的,JVisualVM是自jdk1.6以后就有了,功能比jconsole強大
所以我就選擇了JvisualVM
JvisualVM可以在JAVA_HOME/bin/這個目錄下找到
使用JvisualVM的過程並不順利。
第一個出現的問題是 "無法檢測到本地java應用程序"。
網上找到不少解決方案,其中一個方案是在啟動java程序的時候添加一個參數即可:
-XX:+PerfBypassFileSystemCheck
參考:http://my.oschina.net/building/blog/74626;
這種方案對於用tomcat的同學來說不是很方便,而且這也不是最佳的解決辦法
然后就找到了這個:http://blog.csdn.net/uusad/article/details/7979670,
說出現這個問題的原因是windows用戶名出現了大寫的字母,需要刪除臨時目錄,讓JvisualVM重新建臨時目錄
這里面有詳細說明。
然后是配置問題,也是找了好多資料都沒有看的很明白。
這個是說的比較好懂的:http://www.ahlinux.com/tomcat/22979.html
主要是在tomcat/bin/catalina.bat(windows)或者tomcat/bin/catalina.sh(linux)里面加上一段jmx的配置
windows需要加:
set JAVA_OPTS= -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10004 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
linux需要加
JAVA_OPTS=' -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false'
需要注意的是JAVA_OPTS這個參數需要注意,這個參數也是配置tomcat分配jvm內存配置參數,如:
JAVA_OPTS="-Xms1024m -Xmx4056m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m"
這段配置的意思是tomcat啟動是就分配java初始化堆棧大小(-Xms)為1024m,最大堆棧大小(-Xmx)4056m ,線程堆棧大小(-Xss)1024K,永久帶初始化(-XX:PermSize)256m,永久帶最大值(-XX:MaxPermSize)512m。說以在配這一段的時候直接加在這個后面就好了
JAVA_OPTS="-Xms1024m -Xmx4056m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
如果是監控本地程序還需要到jdk目錄的jre的manager下面修改一個文件.比如:
進入JDK安裝目錄,C:\Program Files\Java\jdk1.6.0_25\jre\lib\management,把jmxremote.password.template重命名,去掉后綴,改為jmxremote.password。
具體操作可以看上面給出的鏈接。
如果是監控遠程的tomcat就直接是先添加遠程主機,然后在遠程主機上添加jmx鏈接,填上剛才配置的端口就好了
如果遠程監控需要密碼控制的話-Dcom.sun.management.jmxremote.authenticate=false這個參數就需要改成true。
用戶名密碼可以指定文件-Dcom.sun.management.jmxremote.pwd.file=$JAVA_HOME/jre/lib/management/jmxremote.password
用戶和權限是存在$JAVA_HOME/jre/lib/management/jmxremote.access中
文件里面都有詳細的注釋,這里就不詳細介紹了。
附:
JAVA_OPTS和CATALINA_OPTS的區別,
上面我們用的配置全都是用JAVA_OPTS配置的,其實CATALINA_OPTS也可以完成該配置。它們之間的區別:
CATALINA_OPTS:只被當前tomcat以start,run或者debug命令執行時使用的jvm配置,比如heap size, GC logging, JMX ports etc.
JAVA_OPTS:任何命令執行時的java runtime jvm配置。能被tomcat和停止線程使用,大部分配置應該被配置 CATALINA_OPTS.
可以參考:http://stackoverflow.com/questions/11222365/catalina-opts-vs-java-opts-what-is-the-difference