jconsole/JvisualVM 监视jvm和远程tomcat
以前做程序很少对程序的运行状态做监控,今天决定对现在做的这个程序进行一下监控
监视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