Všichni jste si již určitě dostali do situace, kdy je třeba sledovat prostředky, které má JVM přiděleno a tyto informace nějakým způsobem reflektovat ve vaší aplikaci. V tomto článku si ukážeme, že získání těchto informací není vůbec složité.
Informace a jak se k nim dostat
Při spuštění vašeho Java programu se spustí JVM, které vám dokáže podávat informace, které jsou k dispozici při jeho běhu. Všechny tyto informace jsou k dispozici přes MBean server a skrz JMX zprávy. Pokud o těchto technologiích slyšíte poprvé, pokusím se je krátce představit.
MBeans a JMX
MBeans jsou speciálním typem objektů, které umožňují správu zdrojů vaší aplikace a jejich vzdálené čtení a zápis. Tyto zdroje mohou být jak atributy, které lze z aplikace získat či je upravit, mohou to být operace, které lze v aplikaci spouštět, nebo mohou mít podobu událostí, které jsou z vaší aplikace vyvolávány. Tolik asi definice – klasický příklad je pak čtení/úprava konfigurace v aplikaci, její uložení pomocí operace a vytvoření události při její změně, kterou můžete zaznamenat a nějakým způsobem ji zpracovat.
JMX API (Java Management Extension) je prostředkem k samotným MBeans a umožňuje jejich vzdálené volání pomocí RMI.
Java Monitoring a Management
Jaké možnosti tedy máme, pokud chceme získat informace o JVM na které běží naše aplikace? K získání těchto informací slouží MBeans, které se nazývají platform MBean (MXBean). Standardně jsou v Javě k dispozici následující MXBeans (přístup k nim je skrze statickou třídu ManagementFactory – pokud tedy chceme například ClassLoadingMXBean, použijeme konstrukci ManagementFactory.getClassLoadingMXBean()), pomocí kterých můžeme získat užitečné informace:
- ClassLoadingMXBean – pro práci s classloaderem (např.: ManagementFactory.getClassLoadingMXBean().getLoadedClassCount())
- CompilationMXBean – pro práci s kompilátorem (např.: ManagementFactory.getCompilationMXBean().getTotalCompilationTime())
- GarbageCollectorMXBean – pro práci s garbage collectorem
- MemoryManagerMXBean – pro práci s memory managementem
- MemoryPoolMXBean – pro práci s memory poolem
- MemoryMXBean – pro práci s pamětí (např.: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage())
- OperatingSystemMXBean – pro práci s operačním systémem (např.: ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors())
- RuntimeMXBean – pro práci s JVM (např.: ManagementFactory.getRuntimeMXBean().getStartTime())
- ThreadMXBean – pro práci s vlákny (např.: ManagementFactory.getThreadMXBean().getThreadCount())
Jak sami vidíte, Java podporuje celou řadu MXBeanů, pomocí kterých se můžete dostat k mnoha informacím – zajímavé jsou pak předevčím poslední dva objekty, protože jejich informace jsou velice užitečné zejména při profilování a optimalizaci aplikace.
Na závěr upozorním pouze na pár metod, které používáme v našich aplikacích a které se nám osvědčily:
- ManagementFactory.getRuntimeMXBean().getUptime(); – celkový čas od spuštění JVM (aplikace)
- ManagementFactory.getRuntimeMXBean().getSystemProperties(); – vrací mapu všech systémových proměnných
- ManagementFactory.getRuntimeMXBean().getBootClassPath(); – vrátí classpath při startu aplikace (String)
- ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime(); – procesorový čas, který vlákna zpotřebovala (long)
- ManagementFactory.getThreadMXBean().getTotalStartedThreadCount(); – celkový počet vláken, které naše aplikace spustila
- ManagementFactory.getThreadMXBean().getAllThreadIds(); – pole (long) všech id vláken
Podělte se s námi v diskuzi, jakým způsobem používáte MBeans/JMX a které MXBeans pravidelně využíváte.
27.8.2010 at 08:12
Pěkné. Malá poznámečka k tématu.
V Java5 a nižší je nutné lokální přístup k JMX povolit pomocí systémové proměnné. Od Javy6 má již každý proces aktivován lokální přístup, takže se na něj (na výše uvedené JMX beany) dostaneme bez přepínačů (např. pomocí JConsole).
To je super – vidím, že program blbne, bez restartu se připojím a prozkoumám to…
13.9.2010 at 13:34
Využívám existující JMX beany z frameworků, např hibernate statistic service (org.hibernate.jmx.StatisticsService)