(转)用JMX监测JVM的运行参数
翻译自http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
用JMX管理你的JVM
JMX是Java管理扩展的缩写,也是当前Java技术中很核心的一块,JMX使得构建可扩展、可管理、伸缩性好的Java框架变得更加容易。更重要的是,JMX是J2SE的一部分,也就是说,使用JMX还能获得很好的兼容性,因为它是标准Java的一部分
说了这些,也许你对JMX的重要性还是没有很直观的认识,那么当你知道最普及的servlet容器tomcat、大名鼎鼎的开源服务器JBOSS,都是完全基于JMX的,甚至连大部分商用的应用服务器如weblogic,都采用JMX作为其管理平台的实现时,你还会怀疑JMX的重要性吗。还是半信半疑?OK,就连与你朝夕相处的JVM,都是基于JMX架构的!本文就是介绍关于如何用JMX对你的JVM进行管理
1.设置环境变量
可以在命令行以java -Dproperty=value的形式设置环境变量,不过这样只会对当前命令行窗口有效;或者修改操作系统的环境变量
在以前的Java中,要想利用JMX管理某个JVM应用,必须加上com.sun.management.jmxremote这个系统变量,以告之JVM开放特定端口和协议用于管理。但是Java6已经默认支持JMX了,也就是说:
在过去的Java版本中,假设你要运行Notepad这个程序,必须这么做:
% cd JDK_HOME/demo/jfc/Notepad
% java -Dcom.sun.management.jmxremote -jar Notepad.jar
而在Java6中,只需敲入% java -jar Notepad.jar 即可,接下来任意JMX兼容的客户端都可以连接到这个应用进行管理,实现所谓的out-of-the-box管理。(在Windows系统中,出于安全原因,如果要进行本地的监控与管理,你的临时文件夹目录必须是NTFS格式的,否则不能提供足够的访问控制)
2.运行jconsole
这是一个默认的JMX管理客户端实现,直接在命令行敲入jconsole即可。jconsole用作相关的调试很方便,但是不适合作为商用,因为这东西本身比较占资源
3.在jconsole里面就能看到刚刚运行的Notepad了,双击连接即可,连接后可以看到该程序运行的各项性能参数
Ok了,就这么多?非也,以上只是针对本地监视和管理的,也就是在一台机器上运行监控程序和被监控程序,如果是远程呢,jconsole不在本机呢?那就比较麻烦一些了
1.远程的话,首先在运行某个Java程序前,必须加上一些变量参数:com.sun.management.jmxremote.port=portNum
portNum指代RMI连接的端口号。同时,远程连接必须提供安全保证,所以默认使用基于SSL和TLS的密码认证
2.设置密码(单用户)
将JRE_HOME/lib/management目录的jmxremote.password.template文件改名为jmxremote.password,修改文件的访问权限,只有管理员才能读写。然后给不同角色设置密码,默认已经有两个角色 monitorRole 和controlRole
3.设置密码(多用户)
将JRE_HOME/lib/management目录的jmxremote.password.template文件拷贝到JRE根目录并改名为jmxremote.password;同样修改权限、设置密码;然后按以下参数启动JVM:com.sun.management.jmxremote.password.file=pwFilePath
其中,pwFilePath是密码文件的路径
4.用jconsole连接
如果不用SSL,那么直接输入:jconsole hostName:portNum
如果使用SSL,就要加上参数:% java -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password Server
这只是验证了服务器端而已,如果还要验证SSL客户端,也要设置类似的值,详细设置可以参考:http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores
我们继续深入讨论一下刚才说到的密码验证。JMX提供了两个文件进行密码和访问控制,一个是刚才提到的jmxremote.password文件,用于设置角色密码;另一个jmxremote.access 是访问控制文件,定义了每个角色的读写的权限
密码文件示例:
# The "monitorRole" role has password "QED".
# The "controlRole" role has password "R&D".
monitorRole QED
controlRole R&D
access文件示例:
# o The "monitorRole" role has readonly access.
# o The "controlRole" role has readwrite access.
monitorRole readonly
controlRole readwrite
监测和管理相关的系统属性
之前已经提到了一些属性和含义,但是我们是在命令行下设置它们的,为了不每次都这么做,JMX提供了一个属性文件,即JRE_HOME/lib/management/management.properties,文件里面以注释形式提供了所有属性的含义和用法。