`
程序新手
  • 浏览: 59537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

运用JMX远程监控、管理JVM

阅读更多

问题背景讨论:在JAVA运行时,对JVM系统的检测、管理是开发同学一直期望的,目前有一些开源产品开源针对JVM进行监控,例如javamelody等等,这样框架虽然好,但是如果使用会带来一些问题。第一:由于javamelody入口是一个filter,所以会带来性能问题、第二:如果应用服务器很多,会缺乏统一管理,此外安全性、爬虫等等问题略过不提
     JDK自带了故障检测工具Jconsole和1.6出来的Jvisualvm都可以远程对服务器进行监控,后者甚是提供可以在线得到ThreadDump和HeapDump文件,更是提供了可扩展插件功能(虽然可能会影响jvm服务器性能)
    但现状很多公司都有自己的运维团队,未必会把线上服务器的权限交给我们开发同学,所以有必要了解JAVA远程管理方面的知识,假设如果在后台有一套系统,可以管理、监控我们线上所有java服务器,如果出现问题不需要对每个服务器进行排查而是直接从列表中获取、定位到信息,岂不是一件很幸福的事情~

    书归正文,分享下近几天在JMX方面的知识,JDK的API中翻译过来对javax.management的描述

     提供 Java Management Extensions 的核心类。
     Java Management Extensions (JMXTM) API 是一个用于管理和监视的标准 API。典型用途包括:
       1) 查询并更改应用程序配置
       2) 累积有关应用程序行为的统计数据并使其可用
       3) 通知状态更改及错误状况。
       4) JMX API 还可以作为解决方案的一部分来管理系统、网络等。
       5) API 包括远程访问,远程管理程序可以基于这些目的与正在运行的应用程序进行交互。
     JMX核心类为Mbean。MBean 是表示资源的指定管理对象。它有一个管理接口,该接口包括以下内容:
       1) 可以读取和/或写入的指定名称和类型的属性 
       2) 可以调用的指定名称和类型的操作
       3) 可以由 MBean 发送的指定类型的通知。
     推荐一篇文章可以让大家入门
     http://www.ibm.com/developerworks/cn/java/j-lo-jse63/
   
     配置远程连接tomcat需要在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

   关于配置JMX,可以具体参考http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html#remote
   
   实战远程连接TOMCAT
   1) 获取连接 
  

private static void getConnection() throws Exception {   
  
    //用户名、密码   
                 Map<String, String[]> map = new HashMap<String, String[]>();   
    map   
            .put("jmx.remote.credentials", new String[] { "monitorRole",   
                    "QED" });   
    String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.0.100:1000/jmxrmi";   
       
    JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);   
    connector = JMXConnectorFactory.connect(serviceURL, map);   
    mbsc = connector.getMBeanServerConnection();   
  
}   

  2) 获取所有的objectName

   Set MBeanset = mbsc.queryMBeans(null, null);   
Iterator MBeansetIterator = MBeanset.iterator();   
while (MBeansetIterator.hasNext()) {   
    ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator   
            .next();   
    ObjectName objectName = objectInstance.getObjectName();   
    MBeanInfo objectInfo = mbsc.getMBeanInfo(objectName);   
    System.out.print("ObjectName:" + objectName.getCanonicalName()   
            + ".");   
    System.out.print("mehtodName:");   
    for (int i = 0; i < objectInfo.getAttributes().length; i++) {   
        System.out.print(objectInfo.getAttributes()[i].getName() + ",");   
    }   
    System.out.println();   
}   

 

3) 获取堆内存信息

 ObjectName heapObjName = new ObjectName("java.lang:type=Memory");   
  
//堆内存   
MemoryUsage heapMemoryUsage = MemoryUsage   
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,   
        "HeapMemoryUsage"));   
long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配   
long usedMemory = heapMemoryUsage.getUsed();   
System.out.print("堆内存总量:"+heapMemoryUsage.getMax()/1024+"KB,当前分配量:"+commitMemory/1024+"KB,当前使用率:"+usedMemory/1024+"KB,");   
System.out.println("堆内存使用率:" + (int) usedMemory * 100  
        / commitMemory + "%");// 堆使用率   
  
      //栈内存   
        MemoryUsage nonheapMemoryUsage = MemoryUsage   
        .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,   
                "NonHeapMemoryUsage"));   
        long noncommitMemory = nonheapMemoryUsage.getCommitted();   
long nonusedMemory = heapMemoryUsage.getUsed();   
  
System.out.println("栈内存使用率:" + (int) nonusedMemory * 100  
        / noncommitMemory + "%");   
           
//PermGen内存   
        ObjectName permObjName = new ObjectName(   
"java.lang:type=MemoryPool,name=Perm Gen");   
  
MemoryUsage permGenUsage = MemoryUsage   
        .from((CompositeDataSupport) mbsc.getAttribute(permObjName,   
                "Usage"));   
long committed = permGenUsage.getCommitted();// 持久堆大小   
long used = heapMemoryUsage.getUsed();//     
System.out.println("perm gen:" + (int) used * 100 / committed   
        + "%");// 持久堆使用率 

 

4) 获取堆中伊甸区

ObjectName youngHeapObjName = new ObjectName("java.lang:type=MemoryPool,name=Eden Space");   
    // 获取Mbean对象   
    MBeanInfo youngHeapInfo = mbsc.getMBeanInfo(youngHeapObjName);   
    // 获取对象的属性   
    MBeanAttributeInfo[] youngHeapAttributes = youngHeapInfo.getAttributes();   
           
    MemoryUsage youngHeapUsage = MemoryUsage   
                .from((CompositeDataSupport) mbsc.getAttribute(youngHeapObjName, "Usage"));   
           
       System.out.print("目前新生区分 配最大内存:"+youngHeapUsage.getMax()/1024+"KB,");   
       System.out.print("新生区已分配:"+youngHeapUsage.getCommitted()/1024+"KB,");   
       System.out.print("新生区初始化:"+youngHeapUsage.getInit()/1024+"KB,");   
       System.out.println("新生区已使用"+youngHeapUsage.getUsed()/1024+"KB");   
     

 

5) 获取线程

ObjectName managerObjName = new ObjectName(   
                "Catalina:type=Manager,*");   
        Set<ObjectName> s = mbsc.queryNames(managerObjName, null);   
        for (ObjectName obj : s) {   
               
            ObjectName objname = new ObjectName(obj.getCanonicalName());   
            System.out.print("objectName:"+objname);   
            System.out.print(",最大会话数:"  
                    + mbsc.getAttribute(objname, "maxActiveSessions")+",");   
            System.out.print("会话数:"  
                    + mbsc.getAttribute(objname, "activeSessions")+",");   
            System.out.println("活动会话数:"  
                    + mbsc.getAttribute(objname, "sessionCounter"));  

 

由于可以获取的信息很多,暂不全部列出来 
翻过头来看下tomcat对JMX的支持


     看完上面最后一段话,有没有一种很雷人的感觉

     关于tomcat对JMX的支持可以看下详细的文档
     http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html
    
     当我们默认直接访问tomcat提供的JMX接口时(http://localhost:8080/manager/jmxproxy/?qry=)会出现所有的MBeans,

 

 如果想要具体的MBeans只需要将其name后面的值放在url的后面  


  因此,在默认情况下我们看到的信息都可以通过远程方式获取到,下一篇会介绍如何远程管理Tomcat

  • 大小: 395.4 KB
  • 大小: 57 KB
  • 大小: 157.9 KB
2
1
分享到:
评论
2 楼 JavaCrazyer 2013-01-05  
额,其实没必要这么麻烦,tomcat管理页面就有这些功能。如果需要更多信息,只需要写个JSP,调用JDK自带的
RuntimeMXBean runtime =  ManagementFactory.getRuntimeMXBean() ;
// ManagementFactory.getThreadMXBean() 方法或从平台 MBeanServer 方法获得它。ThreadMXBean mb = ManagementFactory.getThreadMXBean();
//
MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans() ;
通过这些代码继续扩展你能获得更多服务器上的信息
1 楼 lnfszl 2012-04-11  
请问有没有研究过,开启JMX会不会对jvm带来性能问题

相关推荐

    visualvm监控jvm及远程jvm监控方法

    通过以上步骤,开发者可以利用VisualVM有效地管理和监控JVM,及时发现并解决性能问题,提高Java应用的稳定性和效率。无论是本地还是远程,VisualVM都是一个强大且易用的JVM工具,值得在日常开发和调优工作中使用。

    使用RMI远程连接JVM.用JMX获取JVM的参数

    在Java世界中,远程方法调用(Remote Method Invocation, RMI)和Java管理扩展(Java Management Extensions, JMX)是两个强大的工具,用于管理和监控分布式系统。本文将深入探讨如何利用RMI远程连接到Java虚拟机...

    jmx监控weblogic,tomcat,websphere源码

    首先,WebLogic是由Oracle公司提供的一个全面的企业级Java应用服务器,它支持JMX来暴露管理接口,允许管理员远程监控服务器的状态、配置以及执行管理操作。通过JMX,你可以获取到WebLogic服务器的运行时信息,如JVM...

    jmx-jvm配置

    总的来说,JMX-JVM配置是一项强大的功能,它使得开发者和管理员能够实时监控和调整Java应用的运行状态,从而优化性能、诊断问题和实施细粒度的管理策略。正确配置和使用JMX对于提升Java应用的稳定性和效率至关重要。

    JVM JMX java

    JMX可以集成到JVM中,以便监控JVM的状态和性能,例如: 1. **监控GC**:通过JMX获取JVM的垃圾收集统计信息,如垃圾收集时间、内存分配情况等。 2. **线程诊断**:查看和分析JVM中的线程状态,查找死锁或资源争抢...

    JMX-how-to-use.rar_jmx_服务器_远程监控 文件

    3. **JMX远程监控** 要实现远程监控,需要配置JMX RMI服务,让JMX服务器暴露一个RMI注册表,允许远程客户端连接。这通常涉及到在Java虚拟机(JVM)启动时添加特定的系统属性,如`com.sun.management.jmxremote`、`...

    java实现简单远程监控

    在IT行业中,远程监控是一项重要的技术,它允许管理员在远离设备的地方实时查看和管理系统状态。在Java中实现远程监控可以利用Java的多种内置特性,如JMX(Java Management Extensions)、RMI(Remote Method ...

    java 远程监控程序JSN

    Java远程监控程序JSN是一种用于监视和管理分布式Java应用程序的工具。它允许开发者或系统管理员在不中断应用程序运行的情况下收集性能数据、诊断问题并进行优化。JSN(Java Server Monitoring)通常包括各种功能,如...

    JVM监控工具使用入门

    jvisualvm是一款功能更全面的JVM监控工具,它不仅能够监控JVM的状态,还可以进行垃圾回收管理、线程分析等功能。jvisualvm的界面友好,非常适合进行深入的性能分析工作。 **使用步骤:** 1. **启动jvisualvm**:...

    使用JMX连接JVM实现过程详解

    JMX也可以用来监控远程环境,可以跨越不同操作系统平台和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。 本文对JMX的概念、安装、配置和使用进行了详细的介绍,为读者提供了一份详细的参考指南。...

    05-VIP-JVM调优工具详解(预习资料)1

    在实际应用中,可以使用Jmap命令查看内存信息,使用Jvisualvm可视化性能数据,使用Jstack命令找到死锁和高CPU使用率的线程,使用JMX远程监控和管理Java应用程序。这些工具可以帮助开发者和运维人员更好地了解JVM的...

    84_Java远程监控系统.zip

    Java远程监控主要依赖于Java Management Extensions (JMX) 技术,JMX 是Java平台的标准组件,它提供了一种框架来创建、管理和部署管理工具,以监控和管理Java应用程序。通过JMX,你可以暴露应用程序中的各种资源(如...

    jvisualvm来JVM监控

    6. **JMX连接**:远程连接到其他运行中的Java应用,进行监控和管理,支持配置JMX代理。 四、使用案例 例如,当我们发现应用运行缓慢,怀疑存在内存泄漏时,可以使用jvisualvm的内存分析功能: 1. 首先,连接到...

    Java VisualVM监控远程JVM(详解)

    在远程监控方面,VisualVM 支持两种连接方式:jstatd 和 JMX(Java Management Extensions)。本文将详细介绍如何通过 JMX 方式配置并监控远程的 JVM 进程。 首先,要通过 JMX 方式监控远程 JVM,需要在远程主机上...

    cmdline-jmxclient.zip

    总结来说,"cmdline-jmxclient.zip"提供了一个命令行工具,用于通过JMX协议连接到JVM,尤其是Tomcat这样的Java应用服务器,以便进行远程监控和管理。这在日常运维、性能优化、故障排查等场景中非常有用,尤其是在...

    jmx相关jar包

    它包含了支持JMX远程连接的类和配置,允许你从远程主机或不同的Java虚拟机(JVM)中管理和监控应用程序。通常,你需要将这个库与`jmxri.jar`一起使用,以启用JMX服务的远程连接。这包括了JMX Remote Lifecycle API,...

    jvm监控工具介绍

    jstatd是JVM监控服务,它基于RMI(Remote Method Invocation)技术,允许远程机器获取本地JVM应用的信息。默认监听1099端口。在启用jstatd时,可能需要配置安全策略文件(如`jstatd.all.policy`),赋予必要的权限...

Global site tag (gtag.js) - Google Analytics