JMX是defacto标准,用于监控与Java虚拟环境有任何关系的所有应用程序。鉴于Groovy直接位于Java之上,Groovy可以利用已经为Java实现的大量工作。
监视JVM
可以使用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,在启动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
- }
转载本站内容时,请务必注明来自W3xue,违者必究。