文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用JMX监控Tomcat

2023-07-05 17:10

关注

这篇文章主要介绍“如何使用JMX监控Tomcat”,在日常操作中,相信很多人在如何使用JMX监控Tomcat问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用JMX监控Tomcat”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

示例代码

String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);Map map = new HashMap();// 用户名密码,在jmxremote.password文件中查看String[] credentials = new String[] { "monitorRole", "tomcat" };map.put("jmx.remote.credentials", credentials);JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);MBeanServerConnection mbsc = connector.getMBeanServerConnection();// 端口最好是动态取得ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);// tomcat的线程数对应的属性值String attrName = "currentThreadCount";MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));

完整的示例代码文件

import java.lang.management.MemoryUsage;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Formatter;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import javax.management.MBeanAttributeInfo;import javax.management.MBeanInfo;import javax.management.MBeanServerConnection;import javax.management.ObjectInstance;import javax.management.ObjectName;import javax.management.openmbean.CompositeDataSupport;import javax.management.remote.JMXConnector;import javax.management.remote.JMXConnectorFactory;import javax.management.remote.JMXServiceURL;public class JMXTest {        public static void main(String[] args) {        try {            String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";            JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);            Map map = new HashMap();            String[] credentials = new String[] { "monitorRole", "tomcat" };            map.put("jmx.remote.credentials", credentials);            JMXConnector connector = JMXConnectorFactory.connect(serviceURL,                    map);            MBeanServerConnection mbsc = connector.getMBeanServerConnection();            // 端口最好是动态取得            ObjectName threadObjName = new ObjectName(                    "Catalina:type=ThreadPool,name=http-8080");            MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);            String attrName = "currentThreadCount";// tomcat的线程数对应的属性值            MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();            System.out.println("currentThreadCount:"                    + mbsc.getAttribute(threadObjName, attrName));            // heap            for (int j = 0; j < mbsc.getDomains().length; j++) {                System.out.println("###########" + mbsc.getDomains()[j]);            }            Set MBeanset = mbsc.queryMBeans(null, null);            System.out.println("MBeanset.size() : " + MBeanset.size());            Iterator MBeansetIterator = MBeanset.iterator();            while (MBeansetIterator.hasNext()) {                ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator                        .next();                ObjectName objectName = objectInstance.getObjectName();                String canonicalName = objectName.getCanonicalName();                System.out.println("canonicalName : " + canonicalName);                if (canonicalName                        .equals("Catalina:host=localhost,type=Cluster")) {                    // Get details of cluster MBeans                    System.out.println("Cluster MBeans Details:");                    System.out                            .println("=========================================");                    // getMBeansDetails(canonicalName);                    String canonicalKeyPropList = objectName                            .getCanonicalKeyPropertyListString();                }            }            // ------------------------- system ----------------------            ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");            System.out.println("厂商:"                    + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));            System.out.println("程序:"                    + (String) mbsc.getAttribute(runtimeObjName, "VmName"));            System.out.println("版本:"                    + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));            Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,                    "StartTime"));            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            System.out.println("启动时间:" + df.format(starttime));            Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");            System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));            // ------------------------ JVM -------------------------            // 堆使用率            ObjectName heapObjName = new ObjectName("java.lang:type=Memory");            MemoryUsage heapMemoryUsage = MemoryUsage                    .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,                            "HeapMemoryUsage"));            long maxMemory = heapMemoryUsage.getMax();// 堆最大            long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配            long usedMemory = heapMemoryUsage.getUsed();            System.out.println("heap:" + (double) usedMemory * 100                    / commitMemory + "%");// 堆使用率            MemoryUsage nonheapMemoryUsage = MemoryUsage                    .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,                            "NonHeapMemoryUsage"));            long noncommitMemory = nonheapMemoryUsage.getCommitted();            long nonusedMemory = heapMemoryUsage.getUsed();            System.out.println("nonheap:" + (double) nonusedMemory * 100                    / noncommitMemory + "%");            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:" + (double) used * 100 / committed                    + "%");// 持久堆使用率            // -------------------- Session ---------------            ObjectName managerObjName = new ObjectName(                    "Catalina:type=Manager,*");            Set<ObjectName> s = mbsc.queryNames(managerObjName, null);            for (ObjectName obj : s) {                System.out.println("应用名:" + obj.getKeyProperty("path"));                ObjectName objname = new ObjectName(obj.getCanonicalName());                System.out.println("最大会话数:"                        + mbsc.getAttribute(objname, "maxActiveSessions"));                System.out.println("会话数:"                        + mbsc.getAttribute(objname, "activeSessions"));                System.out.println("活动会话数:"                        + mbsc.getAttribute(objname, "sessionCounter"));            }            // ----------------- Thread Pool ----------------            ObjectName threadpoolObjName = new ObjectName(                    "Catalina:type=ThreadPool,*");            Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);            for (ObjectName obj : s2) {                System.out.println("端口名:" + obj.getKeyProperty("name"));                ObjectName objname = new ObjectName(obj.getCanonicalName());                System.out.println("最大线程数:"                        + mbsc.getAttribute(objname, "maxThreads"));                System.out.println("当前线程数:"                        + mbsc.getAttribute(objname, "currentThreadCount"));                System.out.println("繁忙线程数:"                        + mbsc.getAttribute(objname, "currentThreadsBusy"));            }        } catch (Exception e) {            e.printStackTrace();        }    }    public static String formatTimeSpan(long span) {        long minseconds = span % 1000;        span = span / 1000;        long seconds = span % 60;        span = span / 60;        long mins = span % 60;        span = span / 60;        long hours = span % 24;        span = span / 24;        long days = span;        return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",                days, hours, mins, seconds, minseconds).toString();    }}

到此,关于“如何使用JMX监控Tomcat”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯