JMX是defacto標(biāo)準(zhǔn),用于監(jiān)控與Java虛擬環(huán)境有任何關(guān)系的所有應(yīng)用程序。鑒于Groovy直接位于Java之上,Groovy可以利用已經(jīng)為Java實(shí)現(xiàn)的大量工作。
可以使用java.lang.management中提供的標(biāo)準(zhǔn)類(lèi)來(lái)執(zhí)行JVM的監(jiān)視。以下代碼示例說(shuō)明如何完成此操作。
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" } }
當(dāng)代碼執(zhí)行時(shí),輸出將根據(jù)運(yùn)行代碼的系統(tǒng)而變化。下面給出了輸出的樣本。
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]
為了監(jiān)視tomcat,在啟動(dòng)tomcat時(shí)應(yīng)設(shè)置以下參數(shù) -
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發(fā)現(xiàn)正在運(yùn)行的Tomcat中的可用MBean,確定哪些是Web模塊并提取每個(gè)Web模塊的處理時(shí)間。
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 }
更多建議: