zoukankan      html  css  js  c++  java
  • Jconsole 监控tomcat

    通过jconsole监控可以获取监控tomcat的相关的数据信息

    如何通过代码来获取其中的线程和内存状况呢?

    首先要配置好jconsole监控的相关配置,一搜基本就是那一个,

    配置配不好的话接下来的工作就做不好了,所有要先配置好,然后可以上代码了:

      1 package one;
      2 
      3 import java.io.IOException;
      4 import java.lang.management.MemoryMXBean;
      5 import java.lang.management.MemoryUsage;
      6 import java.lang.management.ThreadMXBean;
      7 
      8 import java.lang.reflect.*;
      9 import java.util.*;
     10 
     11 import javax.management.*;
     12 import javax.management.remote.*;
     13 
     14 //mxbean_name constant
     15 import static java.lang.management.ManagementFactory.*;
     16 
     17 public class MyJconsole {
     18     
     19     private SnapshotMBeanServerConnection server = null;
     20     private String jmxURL = null;
     21     private MBeanServerConnection mbsc = null;
     22     private JMXConnector connector = null;
     23     
     24     private JMXServiceURL serviceURL;
     25     private Map<String, String[]> map;
     26     private boolean hasPlatformMXBeans = false;
     27     
     28     private ThreadMXBean     threadMBean = null;
     29     private MemoryMXBean    memoryMBean = null;
     30     
     31     public interface SnapshotMBeanServerConnection
     32     extends MBeanServerConnection {
     33     /**
     34      * Flush all cached values of attributes.
     35      */
     36     public void flush();
     37     }
     38 
     39     public static class Snapshot {
     40         private Snapshot() {
     41         }
     42         public static SnapshotMBeanServerConnection
     43             newSnapshot(MBeanServerConnection mbsc) {
     44             final InvocationHandler ih = new SnapshotInvocationHandler(mbsc);
     45             return (SnapshotMBeanServerConnection) Proxy.newProxyInstance(
     46                     Snapshot.class.getClassLoader(),
     47                     new Class[] {SnapshotMBeanServerConnection.class},
     48                     ih);
     49         }
     50     }
     51     
     52     public synchronized ThreadMXBean getThreadMXBean() throws IOException {
     53         if (hasPlatformMXBeans && threadMBean == null) {
     54             threadMBean =
     55                 newPlatformMXBeanProxy(server, THREAD_MXBEAN_NAME,
     56                                        ThreadMXBean.class);
     57         }
     58         return threadMBean;
     59     }
     60     
     61     public synchronized MemoryMXBean getMemoryMXBean() throws IOException {
     62         if (hasPlatformMXBeans && memoryMBean == null) {
     63             memoryMBean =
     64                 newPlatformMXBeanProxy(server, MEMORY_MXBEAN_NAME,
     65                                        MemoryMXBean.class);
     66         }
     67         return memoryMBean;
     68     }
     69     
     70     public MyJconsole(){
     71         jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";
     72         map = new HashMap<String, String[]>();
     73         String[] credentials = new String[] { "monitorRole", "tomcat" };
     74         map.put("jmx.remote.credentials", credentials);
     75     }
     76     
     77     public void tryConnect() throws IOException {
     78         try {
     79             serviceURL = new JMXServiceURL(jmxURL);
     80             connector = JMXConnectorFactory.connect(serviceURL,map);
     81             mbsc = connector.getMBeanServerConnection();
     82             server = Snapshot.newSnapshot(mbsc);
     83             ObjectName on = new ObjectName(THREAD_MXBEAN_NAME);
     84             hasPlatformMXBeans = server.isRegistered(on);
     85         } catch (Exception e) {
     86             e.printStackTrace();
     87         }
     88     }
     89     
     90     public static void main(String[] args){
     91         try {
     92             MyJconsole mjc = new MyJconsole();
     93             mjc.tryConnect();
     94             ThreadMXBean tmBean = mjc.getThreadMXBean();
     95             MemoryMXBean memoryBean  = mjc.getMemoryMXBean();
     96             int tlCount = tmBean.getThreadCount();
     97             int tdCount = tmBean.getDaemonThreadCount();
     98             int tpCount = tmBean.getPeakThreadCount();
     99             long ttCount = tmBean.getTotalStartedThreadCount();
    100             System.out.println("活动线程个数: "+tlCount);                //当前线程数
    101             System.out.println("峰值: " + tpCount);
    102             System.out.println("守护线程数: " + tdCount);
    103             System.out.println("启动线程数总数:" + ttCount);
    104             MemoryUsage u = memoryBean.getHeapMemoryUsage();
    105             long memUsed = u.getUsed();
    106             long memMax = u.getMax();
    107             long memCommited = u.getCommitted();
    108             System.out.println("堆内存使用大小:"+ memUsed/1024+"Kb"); //堆内存;
    109             System.out.println("当前堆大小: " + memUsed + "Kb");
    110             System.out.println("最大堆大小:" + memMax + "Kb");
    111             
    112         } catch (IOException e) {
    113             e.printStackTrace();
    114         }
    115         
    116     }
    117     
    118     static class SnapshotInvocationHandler implements InvocationHandler {
    119 
    120         private final MBeanServerConnection conn;
    121         private Map<ObjectName, NameValueMap> cachedValues = newMap();
    122         private Map<ObjectName, Set<String>> cachedNames = newMap();
    123 
    124         @SuppressWarnings("serial")
    125         private static final class NameValueMap
    126                 extends HashMap<String, Object> {}
    127 
    128         SnapshotInvocationHandler(MBeanServerConnection conn) {
    129             this.conn = conn;
    130         }
    131 
    132         synchronized void flush() {
    133             cachedValues = newMap();
    134         }
    135 
    136         public Object invoke(Object proxy, Method method, Object[] args)
    137                 throws Throwable {
    138             final String methodName = method.getName();
    139             if (methodName.equals("getAttribute")) {
    140                 return getAttribute((ObjectName) args[0], (String) args[1]);
    141             } else if (methodName.equals("getAttributes")) {
    142                 return getAttributes((ObjectName) args[0], (String[]) args[1]);
    143             } else if (methodName.equals("flush")) {
    144                 flush();
    145                 return null;
    146             } else {
    147                 try {
    148                     return method.invoke(conn, args);
    149                 } catch (InvocationTargetException e) {
    150                     throw e.getCause();
    151                 }
    152             }
    153         }
    154 
    155         private Object getAttribute(ObjectName objName, String attrName)
    156                 throws MBeanException, InstanceNotFoundException,
    157                 AttributeNotFoundException, ReflectionException, IOException {
    158             final NameValueMap values = getCachedAttributes(
    159                     objName, Collections.singleton(attrName));
    160             Object value = values.get(attrName);
    161             if (value != null || values.containsKey(attrName)) {
    162                 return value;
    163             }
    164             // Not in cache, presumably because it was omitted from the
    165             // getAttributes result because of an exception.  Following
    166             // call will probably provoke the same exception.
    167             return conn.getAttribute(objName, attrName);
    168         }
    169 
    170         private AttributeList getAttributes(
    171                 ObjectName objName, String[] attrNames) throws
    172                 InstanceNotFoundException, ReflectionException, IOException {
    173             final NameValueMap values = getCachedAttributes(
    174                     objName,
    175                     new TreeSet<String>(Arrays.asList(attrNames)));
    176             final AttributeList list = new AttributeList();
    177             for (String attrName : attrNames) {
    178                 final Object value = values.get(attrName);
    179                 if (value != null || values.containsKey(attrName)) {
    180                     list.add(new Attribute(attrName, value));
    181                 }
    182             }
    183             return list;
    184         }
    185 
    186         private synchronized NameValueMap getCachedAttributes(
    187                 ObjectName objName, Set<String> attrNames) throws
    188                 InstanceNotFoundException, ReflectionException, IOException {
    189             NameValueMap values = cachedValues.get(objName);
    190             if (values != null && values.keySet().containsAll(attrNames)) {
    191                 return values;
    192             }
    193             attrNames = new TreeSet<String>(attrNames);
    194             Set<String> oldNames = cachedNames.get(objName);
    195             if (oldNames != null) {
    196                 attrNames.addAll(oldNames);
    197             }
    198             values = new NameValueMap();
    199             final AttributeList attrs = conn.getAttributes(
    200                     objName,
    201                     attrNames.toArray(new String[attrNames.size()]));
    202             for (Attribute attr : attrs.asList()) {
    203                 values.put(attr.getName(), attr.getValue());
    204             }
    205             cachedValues.put(objName, values);
    206             cachedNames.put(objName, attrNames);
    207             return values;
    208         }
    209 
    210         // See http://www.artima.com/weblogs/viewpost.jsp?thread=79394
    211         private static <K, V> Map<K, V> newMap() {
    212             return new HashMap<K, V>();
    213         }
    214     }
    215 
    216 }

  • 相关阅读:
    使用turtle库绘制一个叠加等边三角形
    使用turtle库绘制图形
    tar命令常用参数讲解
    elasticsearch 中geo point地理位置数据类型
    count(*)和count(1)的sql性能分析
    别再if/else走天下了
    正则表达式 匹配0次1次或者无限次
    linux shell 字符串操作(长度,查找,替换)
    linux expect工具使用
    mongodb分片balance
  • 原文地址:https://www.cnblogs.com/george-cw/p/4172735.html
Copyright © 2011-2022 走看看