JMX是defacto标准,用于监控与Java虚拟环境有任何关系的所有应用程序。鉴于Groovy直接位于Java之上,Groovy可以利用已经为Java实现的大量工作。
可以使用java.lang.management中提供的标准类来执行JVM的监视。以下代码示例说明如何完成此操作。
import java.lang.management.* |
def os = ManagementFactory.operatingSystemMXBean |
println """OPERATING SYSTEM: |
OS architecture = $os.arch |
OS name = $os.name |
OS version = $os.version |
OS processors = $os.availableProcessors |
""" |
def rt = ManagementFactory.runtimeMXBean |
println """RUNTIME: |
Runtime name = $rt.name |
Runtime spec name = $rt.specName |
Runtime vendor = $rt.specVendor |
Runtime spec version = $rt.specVersion |
Runtime management spec version = $rt.managementSpecVersion |
""" |
def mem = ManagementFactory.memoryMXBean |
def heapUsage = mem.heapMemoryUsage |
def nonHeapUsage = mem.nonHeapMemoryUsage |
println """MEMORY: |
HEAP STORAGE: |
Memory committed = $heapUsage.committed |
Memory init = $heapUsage.init |
Memory max = $heapUsage.max |
Memory used = $heapUsage.used NON-HEAP STORAGE: |
Non-heap memory committed = $nonHeapUsage.committed |
Non-heap memory init = $nonHeapUsage.init |
Non-heap memory max = $nonHeapUsage.max |
Non-heap memory used = $nonHeapUsage.used |
""" |
println "GARBAGE COLLECTION:" |
ManagementFactory.garbageCollectorMXBeans.each { gc -> |
println " name = $gc.name" |
println " collection count = $gc.collectionCount" |
println " collection time = $gc.collectionTime" |
String[] mpoolNames = gc.memoryPoolNames |
mpoolNames.each { |
mpoolName -> println " mpool 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时应设置以下参数 -
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 |
} |