Programování

Výpis haldy a analýza pomocí VisualVM

V předchozích příspěvcích na blogu jsem popsal použití VisualVM k získání běhových informací HotSpot JVM podobným způsobem jako jinfo a jak používat VisualVM ve spojení s JMX a MBeans podobným způsobem jako JConsole. Tento příspěvek do blogu se zabývá tím, jak lze VisualVM použít ke generování a analýze výpisu haldy podobným způsobem, jaký se provádí pomocí nástrojů příkazového řádku jmap a jhat.

Nástroj jmap (Java Memory Map) je jedním z několika způsobů, jak lze generovat výpis haldy Java. Stránka TechNotes / man nástroje Java Heap Analysis Tool (jhat) uvádí čtyři metody generování výpisu haldy, které lze analyzovat pomocí jhat. Čtyři uvedené metody pro generování výpisu haldy jsou použití jmap, JConsole (Java Monitoring and Management Console), HPROF, a když dojde k OutOfMemoryError, když -XX: + HeapDumpOnOutOfMemoryError Byla zadána možnost VM. Pátým přístupem, který není uveden, ale je snadno použitelný, je Java VisualVM. (Mimochodem, další metodou je použití MXBean s názvem HotSpotDiagnosticMXBean a jeho metoda dumpHeap (String, Boolean).)

The jmap Tento nástroj je snadno použitelný z příkazového řádku k vytvoření výpisu haldy. Lze jej použít proti spuštěnému procesu Java, jehož ID piocesu (pid) je známé (dostupné prostřednictvím jps), nebo proti základnímu souboru. V tomto příspěvku se zaměřím na používání jmap s ID běžícího procesu.

Stránka jmap to uvádí jmap je experimentální nástroj s relativně omezenými schopnostmi v systému Windows, který nemusí být k dispozici v budoucích verzích JDK. Tato stránka také uvádí dostupné možnosti k určení, jak jmap by měl vygenerovat výpis haldy.

Následující snímek obrazovky ukazuje, jak na to jmap lze použít k odložení hromady.

Vygenerovaný soubor výpisu, Dustin.bin v tomto případě je binární, jak je znázorněno na následujícím snímku obrazovky.

Binární výpis haldy lze číst pomocí jhat nářadí. Sun Java SE 6 zahrnoval implementaci jhat nahrazuje HAT, který byl dříve k dispozici jako samostatné stažení. Spustit je téměř triviální jhat. Stačí se jen dovolat jhat na souboru s výpisem haldy vygenerovaným pomocí jmap (nebo alternativní technika generování výpisu), jak je znázorněno na následujícím snímku obrazovky.

S vygenerovaným haldy (jmap) a jhat vyvolaný nástroj, lze výpis analyzovat pomocí webového prohlížeče. Výstup na konzole nám říká, že výpis je k dispozici na portu 7000 (tento výchozí port lze přepsat pomocí -přístav volba). Když spustím prohlížeč na stejném stroji, na kterém jsem běžel jhat, Můžu použít localhost pro hostitelskou část adresy URL. Úvodní stránka používající localhost a port 7000 se zobrazí na následujícím snímku obrazovky.

Lze napsat příkazy OQL (Arbitrary Object Query Language), které vám pomohou najít potřebné podrobnosti ve výpisu haldy. The jhat-startovaný webový server obsahuje nápovědu OQL na URL // localhost: 7000 / oqlhelp /. Viz také Dotaz na haldu Java s OQL, kde najdete další podrobnosti o tom, jak používat OQL. Často však lze najít to, co potřebujete, jednoduše pomocí již poskytnutých informací a přesunu mezi informacemi pomocí poskytnutých hypertextových odkazů.

Následující snímek obrazovky ukazuje jednu z užitečnějších stránek dostupných díky jhatje výstup haldy skládaný z webového serveru. Tato stránka zobrazuje počet instancí různých objektů Java, včetně objektů platformy.

Významná pomoc při pochopení toho, co tyto webové stránky generují jhat průměr je specifikace VM ve formátu souboru třídy. V části 4.3.2 („Deskriptory polí“) tohoto dokumentu je tabulka, která ukazuje mapování znaků deskriptorů polí na datový typ, který používáme. Podle této tabulky „B“ označuje a byte„C“ označuje a char„D“ označuje a dvojnásobek„F“ označuje a plovák, „I“ označuje celé číslo, „J“ označuje a dlouho„L“ označuje odkaz (instance třídy), „Z“ označuje a booleovský, a [ označuje pole.

Zatím jsem se podíval na používání jmap a jhat z příkazového řádku vygenerovat výpis haldy a poskytnout metodu pro analýzu generovaného výpisu haldy založenou na webovém prohlížeči. Ačkoli jsou tyto nástroje relativně snadno použitelné, VisualVM poskytuje podobné funkce v ještě jednodušším přístupu.

Jednou z metod pro generování výpisu haldy ve Visual VM je jednoduše kliknout pravým tlačítkem na požadovaný proces a vybrat „Heap Dump“. Tato metoda je zobrazena na dalším snímku obrazovky.

Tím se generuje výpis haldy, jak je naznačeno jeho názvem pod procesem Java.

Druhým přístupem pro generování výpisu haldy pomocí VisualVM je kliknutí na požadovaný proces Java, aby se ve VisualVM objevily příslušné karty („Overview“, „Monitor“, „Threads“ a „Profiler“). Výběr karty „Monitor“ poskytuje tlačítko „Heap Dump“, jak je znázorněno na následujícím snímku obrazovky.

Kliknutím na tlačítko „Heap Dump“ dojde k vygenerování haldy, stejně jako tomu bylo u výše popsané možnosti kliknutí pravým tlačítkem. To se zobrazuje na dalším snímku obrazovky, který se v tomto případě zobrazí na kartě „Shrnutí“ analyzovaného výpisu haldy.

Kromě karty „Shrnutí“ analýzy výpisu haldy jsou na kartě „Třída“ uvedeny další zajímavé podrobnosti z výpisu haldy. Tato karta obsahuje vodorovné pruhové grafy, které graficky označují procento celkových instancí, které jsou přidruženy ke každé třídě. Příklad je uveden na dalším snímku obrazovky.

Zobrazené třídy jsou vysvětleny spíše než použití symbolů, které jsou popsány výše pro jhat- analýza skládky haldy. Na kartě „Třídy“ lze kliknout pravým tlačítkem na libovolnou třídu a vybrat možnost „Zobrazit v zobrazení instancí“. Zobrazí se podrobnosti o každé jednotlivé instanci vybrané třídy. To se zobrazí na dalším snímku obrazovky.

Závěr

VisualVM poskytuje několik výhod při vytváření a analýze výpisů haldy. Nejprve je vše od vytvoření po analýzu na jednom místě. Za druhé, data jsou poskytována v tom, co lze považovat za reprezentativnější formát s grafickou podporou. Nakonec lze ve VisualVM použít i další nástroje ve spojení s analýzou výpisu haldy. VisualVM poskytuje komplexní nákup pro mnoho vývojových, ladicích a výkonnostních potřeb vývojáře Java.

Další odkazy

⇒ Odstraňování problémů s Java SE

⇒ Průvodce řešením problémů pro Java SE 6 s HotSpot JVM (PDF)

⇒ Bílá kniha o výkonu Java SE 6

⇒ Co je v mé hromadě Java?

⇒ Analýza hromád Java pomocí jmap a jhat

⇒ Profilování paměti Java pomocí jmap a jhat

Tento příběh „Heap Dump and Analysis with VisualVM“ byl původně publikován společností JavaWorld.