23.2 MBean-Typen, MBean-Server und weitere Begriffe
 
Um mit JMX zu arbeiten, ist wenig Vokabular nötig. Wird etwas überwacht, sprechen wir von einer Managed Component. Hinter den beobachtbaren Komponenten stehen die so genannten MBeans, die an einem MBean-Server registriert werden. Der Zugriff auf die Komponenten erfolgt über einen Adapter, etwa einen HTTP-Adapter, der dann einem Web-Browser die Administration erlaubt. Neben einem HTTP-Adpater lassen sich andere Adaptoren denken, die an den MBean-Server können: RMI oder SNMP wären zwei weitere. Sie stehen auf dem Connector-Level. Der Web-Browser steht hingegen auf einer höheren Stufe beim Remote Manager. Ganz unten stehen die zu überwachenden Komponenten. Sie heißen instrumentalisierte Objekte; alles, was als Java-Objekt darstellbar ist, kann mit JMX instrumentiert werden (Hardware, Software, Dienste, ...). Diese Instrumentierung erfolgt über MBeans. Wichtig zum Verständnis ist die Tatsache, dass die überwachten Elemente im Allgemeinen nicht die über JMX administrierbaren Objekte, sondern die MBeans nur Repräsentanten sind.
Der JMX-Standard sieht für MBeans verschiedene Varianten vor:
|
Standard MBeans |
|
Dynamic MBeans |
|
Model MBeans |
|
Open MBeans |
Die Standard-MBeans stellen den einfachsten Weg für die JMX-Instrumentierung dar. Die nach außen offen gelegte Schnittstelle (Management Interface) spezifiziert der Entwickler explizit, indem er sie in einem Java-Interface definiert.
Wir werden uns im Folgenden mit den einfachen MBeans beschäftigen. Die anderen Typen sind noch leistungsfähiger, und neben den vier Typen bietet der JMX-Standard weitere Möglichkeiten an. So definiert JMX etwa ein Benachrichtigungs-Modell (engl. notification model), das Änderungen an den Komponenten überwacht und meldet.
23.2.1 MBeans des Systems
 
Die JVM repräsentiert Systeminformationen nicht nur über die System-Properties, sondern auch seit Java 5 über MBeans. Die Möglichkeiten der unterschiedlichen MBeans beschreiben Schnittstellen aus dem Paket java.lang.management:
|
ClassLoadingMXBean. Informiert, wie viele Klassen geladen sind und wann eine Klasse geladen wird. |
|
CompilationMXBean. Zeit für die Übersetzung. |
|
MemoryMXBean. Komplexe Bean mit Informationen über den Speicherverbrauch. |
|
ThreadMXBean. Komplexe Bean mit Infos über Threads. |
|
RuntimeMXBean. Welche Laufzeitumgebung führt aus? Wie ist der Bibliothekspfad/Klassenpfad, … |
|
OperatingSystemMXBean. Wenige Systeminfos. |
|
GarbageCollectorMXBean. GCs: Copy, MarkSweepCompact |
|
MemoryManagerMXBean. Welche Speicherverwaltung: CodeCacheManager, Copy,
MarkSweepCompact? |
|
MemoryPoolMXBean. Komplexe MBean für Speicherinformationen, etwa für Code Cache, Eden Space, Survivor Space, Tenured Gen, Perm Gen. |
Exemplare konkreter Klassen liefern Fabrikfunktionen der Klasse ManagementFactory.
class java.lang.management. ManagementFactory
|
|
static ClassLoadingMXBean getClassLoadingMXBean() |
|
static CompilationMXBean getCompilationMXBean() |
|
static List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() |
|
static List<MemoryManagerMXBean> getMemoryManagerMXBeans() |
|
static MemoryMXBean getMemoryMXBean() |
|
static List<MemoryPoolMXBean> getMemoryPoolMXBeans() |
|
static OperatingSystemMXBean getOperatingSystemMXBean() |
|
static RuntimeMXBean getRuntimeMXBean() |
|
static ThreadMXBean getThreadMXBean() |
Testen wir das an einem Beispiel:
Listing 23.1
com/javatutor/insel/jmx/JvmMBeans.java
package com.javatutor.insel.jmx;
import java.lang.management.*;
public class JvmMBeans
{
public static void main( String[] args )
{
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
// init = 0(0K) used = 169568(165K) committed = 2031616(1984K) max = 66650112(65088K)
System.out.println( memoryMXBean.getHeapMemoryUsage() );
// init = 29556736(28864K) used = 12026264(11744K) committed = 29851648(29152K) max =
121634816(118784K)
System.out.println( memoryMXBean.getNonHeapMemoryUsage() );
ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
System.out.println( classLoadingMXBean.getLoadedClassCount() ); // 301
System.out.println( classLoadingMXBean.getTotalLoadedClassCount() ); // 301
System.out.println( classLoadingMXBean.getUnloadedClassCount() ); // 0
}
}
|