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.

Související odkazy