Groovy - JMX
-
简述
JMX 是事实上的标准,用于监控所有与 Java 虚拟环境有关的应用程序。鉴于 Groovy 直接位于 Java 之上,Groovy 可以利用已经为 JMX 和 Java 完成的大量工作。 -
监控 JVM
可以使用 java.lang.management 中可用的标准类来执行 JVM 的监视。以下代码示例显示了如何完成此操作。import java.lang.management.* def os = ManagementFactory.operatingSystemMXBean println """OPERATING SYSTEM: \tOS architecture = $os.arch \tOS name = $os.name \tOS version = $os.version \tOS processors = $os.availableProcessors """ def rt = ManagementFactory.runtimeMXBean println """RUNTIME: \tRuntime name = $rt.name \tRuntime spec name = $rt.specName \tRuntime vendor = $rt.specVendor \tRuntime spec version = $rt.specVersion \tRuntime management spec version = $rt.managementSpecVersion """ def mem = ManagementFactory.memoryMXBean def heapUsage = mem.heapMemoryUsage def nonHeapUsage = mem.nonHeapMemoryUsage println """MEMORY: HEAP STORAGE: \tMemory committed = $heapUsage.committed \tMemory init = $heapUsage.init \tMemory max = $heapUsage.max \tMemory used = $heapUsage.used NON-HEAP STORAGE: \tNon-heap memory committed = $nonHeapUsage.committed \tNon-heap memory init = $nonHeapUsage.init \tNon-heap memory max = $nonHeapUsage.max \tNon-heap memory used = $nonHeapUsage.used """ println "GARBAGE COLLECTION:" ManagementFactory.garbageCollectorMXBeans.each { gc -> println "\tname = $gc.name" println "\t\tcollection count = $gc.collectionCount" println "\t\tcollection time = $gc.collectionTime" String[] mpoolNames = gc.memoryPoolNames mpoolNames.each { mpoolName -> println "\t\tmpool name = $mpoolName" } }
执行代码时,输出将根据运行代码的系统而有所不同。下面给出了输出示例。OPERATING SYSTEM: OS architecture = x86 OS name = Windows 7 OS version = 6.1 OS processors = 4 RUNTIME: Runtime name = 5144@Babuli-PC Runtime spec name = Java Virtual Machine Specification Runtime vendor = Oracle Corporation Runtime spec version = 1.7 Runtime management spec version = 1.2 MEMORY: HEAP STORAGE: Memory committed = 16252928 Memory init = 16777216 Memory max = 259522560 Memory used = 7355840 NON-HEAP STORAGE: Non-heap memory committed = 37715968 Non-heap memory init = 35815424 Non-heap memory max = 123731968 Non-heap memory used = 18532232 GARBAGE COLLECTION: name = Copy collection count = 15 collection time = 47 mpool name = Eden Space mpool name = Survivor Space name = MarkSweepCompact collection count = 0 collection time = 0 mpool name = Eden Space mpool name = Survivor Space mpool name = Tenured Gen mpool name = Perm Gen mpool name = Perm Gen [shared-ro] mpool name = Perm Gen [shared-rw]
-
监控 Tomcat
为了监控 tomcat,在启动 tomcat 时应设置以下参数 -set JAVA_OPTS = -Dcom.sun.management.jmxremote Dcom.sun.management.jmxremote.port = 9004\ -Dcom.sun.management.jmxremote.authenticate=false Dcom.sun.management.jmxremote.ssl = false
以下代码使用 JMX 来发现正在运行的 Tomcat 中可用的 MBean,确定哪些是 Web 模块并提取每个 Web 模块的处理时间。import groovy.swing.SwingBuilder import javax.management.ObjectName import javax.management.remote.JMXConnectorFactory as JmxFactory import javax.management.remote.JMXServiceURL as JmxUrl import javax.swing.WindowConstants as WC import org.jfree.chart.ChartFactory import org.jfree.data.category.DefaultCategoryDataset as Dataset import org.jfree.chart.plot.PlotOrientation as Orientation def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi' def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection def serverInfo = new GroovyMBean(server, 'Catalina:type = Server').serverInfo println "Connected to: $serverInfo" def query = new ObjectName('Catalina:*') String[] allNames = server.queryNames(query, null) def modules = allNames.findAll { name -> name.contains('j2eeType=WebModule') }.collect{ new GroovyMBean(server, it) } println "Found ${modules.size()} web modules. Processing ..." def dataset = new Dataset() modules.each { m -> println m.name() dataset.addValue m.processingTime, 0, m.path }