JConsole是从Java 5中开始引入的一个用于对JVM性能和资源消耗进行监控的图形化工具。
JConsole可以连接本地的Java程序,也可以连接远程的Java程序。由于是GUI的方式使用,所以就不细说那些基本的使用方法了,这里只是记录一下试用过程中遇到的几个小问题及其解决方案。
这里使用的是SPECjbb2005这个benchmark中的Java来做了一下试验,因为它也是一个Java Application的benchmark,可以在run.sh脚本中对“JAVA_OPTIONS=”这一行进行相应的定制。
1. 要实现让JConsole可以远程连接到某个Java程序,则需要在Java程序启动的JAVA_OPTION中添加选项“com.sun.management.jmxremote.port=8888”来指定远程管理的端口。
2. 启动Java程序时,遇到如下报错:
代码如下 | 复制代码 |
[root@localhost SPECjbb2005]# ./run.sh Thu Jul 25 23:00:50 CST 2013 ./jbb.jar:./check.jar: java full version "1.6.0_24-b24" Error: Password file not found: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/jmxremote.password Thu Jul 25 23:00:50 CST 2013 |
这是由于开启Java JMX 远程管理时,默认会有用户名密码的验证,所以需要相应的密码文件。
代码如下 | 复制代码 |
[root@localhost SPECjbb2005]# ls /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/ jmxremote.access jmxremote.password.template management.properties snmp.acl.template |
需要先在jmxremote.access中定义用户权限,然后在jmxremote.password文件中定义用户名和对应的密码,jmxremote.password文件可以复制jmxremote.password.template模板文件来进行修改。
当然,在内网中仅仅用于调试,我们一般可以不设置密码验证和SSL连接方式,Java选项如下:
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
3. 在进行了端口和认证信息的配置后,发现在JConsole中通过IP远程连接JVM依然不成功。
错误信息为:Connection Failed: Retry? The connection to 192.168.52.11:8888 did not succeed. Would you like to try again?
在启动Java时,需要设置RMI远程调用的主机名,一般设置为主机的IP地址即可,如下:
-Djava.rmi.server.hostname=192.168.52.11
(当然,也有可能是由于前面第2点中提到的SSL的设置问题,依然需要检查一下)
关于JConsole,还是得执行看看Oracle的这篇Java SE 6 中的JConsole的描述:
http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
(特别是上面文档中对监控数据、图形代表的意义是需要认真理解的)