首页 > 代码库 > Jconsole 监控tomcat

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 NameValueMap126                 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 =http://www.mamicode.com/ values.get(attrName);161             if (value != null || values.containsKey(attrName)) {162                 return value;163             }164             // Not in cache, presumably because it was omitted from the165             // getAttributes result because of an exception.  Following166             // call will probably provoke the same exception.167             return conn.getAttribute(objName, attrName);168         }169 170         private AttributeList getAttributes(171                 ObjectName objName, String[] attrNames) throws172                 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 =http://www.mamicode.com/ 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) throws188                 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=79394211         private static <K, V> Map<K, V> newMap() {212             return new HashMap<K, V>();213         }214     }215 216 }

Jconsole 监控tomcat