ग्रूवी - जेएमएक्स
जेएमएक्स डिफैक्टो मानक है जिसका उपयोग उन सभी अनुप्रयोगों की निगरानी के लिए किया जाता है जिनका जावा कुंवारी वातावरण से कोई लेना-देना नहीं है। यह देखते हुए कि ग्रूवी सीधे जावा के शीर्ष पर बैठता है, ग्रूवी जावा के लिए जेएमएक्स के लिए पहले से किए गए काम का जबरदस्त लाभ उठा सकता है।
जेवीएम की निगरानी करना
एक JVM की निगरानी के लिए java.lang.management में उपलब्ध मानक कक्षाओं का उपयोग कर सकता है। निम्न कोड उदाहरण दिखाता है कि यह कैसे किया जा सकता है।
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]
मॉनिटरिंग टोमाकट
टॉमकैट की निगरानी करने के लिए, टॉमकैट चालू होने पर निम्नलिखित पैरामीटर सेट किया जाना चाहिए -
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 का उपयोग करता है जो चल रहे टॉमकैट में उपलब्ध एमबीन्स की खोज करता है, यह निर्धारित करता है कि कौन से वेब मॉड्यूल हैं और प्रत्येक वेब मॉड्यूल के लिए प्रसंस्करण समय निकालें।
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
}