如何使用JMX监控Tomcat

其他教程   发布日期:2024年04月18日   浏览次数:303

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

示例代码

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

完整的示例代码文件

  1. import java.lang.management.MemoryUsage;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.Formatter;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import javax.management.MBeanAttributeInfo;
  10. import javax.management.MBeanInfo;
  11. import javax.management.MBeanServerConnection;
  12. import javax.management.ObjectInstance;
  13. import javax.management.ObjectName;
  14. import javax.management.openmbean.CompositeDataSupport;
  15. import javax.management.remote.JMXConnector;
  16. import javax.management.remote.JMXConnectorFactory;
  17. import javax.management.remote.JMXServiceURL;
  18. /**
  19. * @author liuyazhuang
  20. * @date 2016-05-31
  21. */
  22. public class JMXTest {
  23. /**
  24. * main方法
  25. * @param args
  26. */
  27. public static void main(String[] args) {
  28. try {
  29. String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";
  30. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
  31. Map map = new HashMap();
  32. String[] credentials = new String[] { "monitorRole", "tomcat" };
  33. map.put("jmx.remote.credentials", credentials);
  34. JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
  35. map);
  36. MBeanServerConnection mbsc = connector.getMBeanServerConnection();
  37. // 端口最好是动态取得
  38. ObjectName threadObjName = new ObjectName(
  39. "Catalina:type=ThreadPool,name=http-8080");
  40. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
  41. String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
  42. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
  43. System.out.println("currentThreadCount:"
  44. + mbsc.getAttribute(threadObjName, attrName));
  45. // heap
  46. for (int j = 0; j < mbsc.getDomains().length; j++) {
  47. System.out.println("###########" + mbsc.getDomains()[j]);
  48. }
  49. Set MBeanset = mbsc.queryMBeans(null, null);
  50. System.out.println("MBeanset.size() : " + MBeanset.size());
  51. Iterator MBeansetIterator = MBeanset.iterator();
  52. while (MBeansetIterator.hasNext()) {
  53. ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator
  54. .next();
  55. ObjectName objectName = objectInstance.getObjectName();
  56. String canonicalName = objectName.getCanonicalName();
  57. System.out.println("canonicalName : " + canonicalName);
  58. if (canonicalName
  59. .equals("Catalina:host=localhost,type=Cluster")) {
  60. // Get details of cluster MBeans
  61. System.out.println("Cluster MBeans Details:");
  62. System.out
  63. .println("=========================================");
  64. // getMBeansDetails(canonicalName);
  65. String canonicalKeyPropList = objectName
  66. .getCanonicalKeyPropertyListString();
  67. }
  68. }
  69. // ------------------------- system ----------------------
  70. ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
  71. System.out.println("厂商:"
  72. + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
  73. System.out.println("程序:"
  74. + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
  75. System.out.println("版本:"
  76. + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
  77. Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
  78. "StartTime"));
  79. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  80. System.out.println("启动时间:" + df.format(starttime));
  81. Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
  82. System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));
  83. // ------------------------ JVM -------------------------
  84. // 堆使用率
  85. ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
  86. MemoryUsage heapMemoryUsage = MemoryUsage
  87. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
  88. "HeapMemoryUsage"));
  89. long maxMemory = heapMemoryUsage.getMax();// 堆最大
  90. long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
  91. long usedMemory = heapMemoryUsage.getUsed();
  92. System.out.println("heap:" + (double) usedMemory * 100
  93. / commitMemory + "%");// 堆使用率
  94. MemoryUsage nonheapMemoryUsage = MemoryUsage
  95. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
  96. "NonHeapMemoryUsage"));
  97. long noncommitMemory = nonheapMemoryUsage.getCommitted();
  98. long nonusedMemory = heapMemoryUsage.getUsed();
  99. System.out.println("nonheap:" + (double) nonusedMemory * 100
  100. / noncommitMemory + "%");
  101. ObjectName permObjName = new ObjectName(
  102. "java.lang:type=MemoryPool,name=Perm Gen");
  103. MemoryUsage permGenUsage = MemoryUsage
  104. .from((CompositeDataSupport) mbsc.getAttribute(permObjName,
  105. "Usage"));
  106. long committed = permGenUsage.getCommitted();// 持久堆大小
  107. long used = heapMemoryUsage.getUsed();//
  108. System.out.println("perm gen:" + (double) used * 100 / committed
  109. + "%");// 持久堆使用率
  110. // -------------------- Session ---------------
  111. ObjectName managerObjName = new ObjectName(
  112. "Catalina:type=Manager,*");
  113. Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
  114. for (ObjectName obj : s) {
  115. System.out.println("应用名:" + obj.getKeyProperty("path"));
  116. ObjectName objname = new ObjectName(obj.getCanonicalName());
  117. System.out.println("最大会话数:"
  118. + mbsc.getAttribute(objname, "maxActiveSessions"));
  119. System.out.println("会话数:"
  120. + mbsc.getAttribute(objname, "activeSessions"));
  121. System.out.println("活动会话数:"
  122. + mbsc.getAttribute(objname, "sessionCounter"));
  123. }
  124. // ----------------- Thread Pool ----------------
  125. ObjectName threadpoolObjName = new ObjectName(
  126. "Catalina:type=ThreadPool,*");
  127. Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
  128. for (ObjectName obj : s2) {
  129. System.out.println("端口名:" + obj.getKeyProperty("name"));
  130. ObjectName objname = new ObjectName(obj.getCanonicalName());
  131. System.out.println("最大线程数:"
  132. + mbsc.getAttribute(objname, "maxThreads"));
  133. System.out.println("当前线程数:"
  134. + mbsc.getAttribute(objname, "currentThreadCount"));
  135. System.out.println("繁忙线程数:"
  136. + mbsc.getAttribute(objname, "currentThreadsBusy"));
  137. }
  138. } catch (Exception e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. public static String formatTimeSpan(long span) {
  143. long minseconds = span % 1000;
  144. span = span / 1000;
  145. long seconds = span % 60;
  146. span = span / 60;
  147. long mins = span % 60;
  148. span = span / 60;
  149. long hours = span % 24;
  150. span = span / 24;
  151. long days = span;
  152. return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
  153. days, hours, mins, seconds, minseconds).toString();
  154. }
  155. }

以上就是如何使用JMX监控Tomcat的详细内容,更多关于如何使用JMX监控Tomcat的资料请关注九品源码其它相关文章!