JMX 基本知识

Java 平台提供了如下一些接口用于管理 JVM 平台
  ClassLoadingMXBean Java 虚拟机的类加载系统。
  CompilationMXBean Java 虚拟机的编译系统。
  MemoryMXBean Java 虚拟机的内存系统。
  ThreadMXBean Java 虚拟机的线程系统。
  RuntimeMXBean Java 虚拟机的运行时系统。
  OperatingSystemMXBean Java 虚拟机在其上运行的操作系统。
  GarbageCollectorMXBean Java 虚拟机中的垃圾回收器。
  MemoryManagerMXBean Java 虚拟机中的内存管理器。
  MemoryPoolMXBean Java 虚拟机中的内存池。
这些 Bean 我们从 ManagementFactory 类中定义。

访问 Mean 的方式有两种
1. 直接访问 MXBean 接口
1.1 通过静态工厂方法获取 MXBean 实例
  从本地访问正在运行的虚拟机的 MXBean 接口。
1.2 构造 MXBean 代理实例,通过调用 ManagementFactory.newPlatformMXBeanProxy 将方法调用转发到给定的 MBeanServer。
  代理通常构造为远程访问另一个正在运行的虚拟机的 MXBean 。

例:
直接调用同一 Java 虚拟机内的 MXBean 中的方法。

import java.lang.management.ManagementFactory;  
import java.lang.management.OperatingSystemMXBean;  
import java.lang.management.ThreadMXBean;  
public class JmxLocal {  
    public static void main(String[] args) {      
        OperatingSystemMXBean osbean = ManagementFactory  
                .getOperatingSystemMXBean();  
        System.out.println(osbean.getArch());//操作系统体系结构  
        System.out.println(osbean.getName());//操作系统名字  
        System.out.println(osbean.getAvailableProcessors());//处理器数目  
        System.out.println(osbean.getVersion());//操作系统版本      
        ThreadMXBean threadBean=ManagementFactory.getThreadMXBean();  
        System.out.println(threadBean.getThreadCount());//总线程数    
    }  
}  

使用 MXBean 代理。访问远程 Mbean

import java.lang.management.ManagementFactory;  
import java.lang.management.ThreadMXBean;  
import javax.management.MBeanServerConnection;  
import javax.management.remote.JMXConnector;  
import javax.management.remote.JMXConnectorFactory;  
import javax.management.remote.JMXServiceURL;  
public class JmxRemote {  
    public static void main(String[] args) {  
        try {  
// connect to a separate VM's MBeanServer, using the JMX RMI functionality  
JMXServiceURL address = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");  
            JMXConnector connector = JMXConnectorFactory.connect(address);  
            MBeanServerConnection mbs = connector.getMBeanServerConnection();  
            ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy  
            (mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);  
            System.out.println(threadBean.getThreadCount());//线程数量        
        } catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
}  

注:

如果要远程访问,被访问 Mbean 服务器首选需要 命令行选项启动远程虚拟机,这些选项设置虚拟机的相关 JMX 代理侦听请求的端口,以及起作用的安全级别如下:
-Dcom.sun.management.jmxremote.port=9999 -- 指定端口
-Dcom.sun.management.jmxremote.authenticate=false – 指定是否需要密码验证
-Dcom.sun.management.jmxremote.ssl=false – 指定是否使用 SSL 通讯

远程监控 Jboss 或者 weblogic 需要配置如下:
Jboss 设置:
  找到 run.bat 文件( linux 环境下是 run.sh )文件,有一行
    set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
  改成
    set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
    -Dcom.sun.management.jmxremote.port=9999
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false

Weblogic 设置:
  找到你要监控 domain 下的 startWebLogic.cmd 文件( linux 环境下是 startWebLogic.sh )文件、将文件中
    set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%
  改成
    set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%
    -Dcom.sun.management.jmxremote.port=9998
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false

Tomcat 设置:
1) 修改JMX配置
  进入JAVA_HOME/jre/lib/management路径下面
  将jmxremote.password.template改成jmxremote.password,将内容中的monitorRole QED的注释去掉
  将management.properties中的com.sun.management.jmxremote.port=(改成你想要的JMX端口号)
  将 com.sun.management.jmxremote.ssl=false、 com.sun.management.jmxremote.authenticate=false注释打开
注意:
linux下需要该权限,chmod 600 jmxremote.access, chmod 600 jmxremote.password
window下特麻烦,现需要jdk装在NTFS文件系统下,选中文件,点右键“属性”-〉安全,点“高级”,去掉“从父项继承....”,弹出窗口中选“删除”,这样删除了所有访问权限。
再选“添加”-〉高级,“立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限窗口,勾选"完全控制",点"确定",OK了。
用jconsole连接远程linux服务时, IP地址和port都输入正确的情况下,仍然是连接失败
vi /etc/hosts,将hostname对应的ip改为真实ip
2) 修改tomcat启动参数
  windows下面为catalina.bat、linux下面为cataina.sh
  set CATALINA_OPTS=-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port="JMXport"
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false

如果不修改的时候默远程连接不上,远程连接的通过IP和JMX端口找到JVM虚拟机后无法定位具体哪个应用使用JMX端口,所以只有在启动tomcat情况后占用JMX

参考:

Jconsole与Jmx 分析JVM状况(上)http://jiangnanguying.iteye.com/blog/539697
Jconsole与Jmx 分析JVM状况(下)http://jiangnanguying.iteye.com/blog/539699 
运用JMX远程监控、管理JVM(一)     http://www.iteye.com/topic/1117196 

 

 

posted @ 2012-06-10 22:48  万法自然~  阅读(3125)  评论(0编辑  收藏  举报