Programovanie

Heap Dump and Analysis with VisualVM

V predchádzajúcich blogových príspevkoch som sa venoval používaniu VisualVM na získavanie runtime informácií HotSpot JVM podobným spôsobom ako jinfo a ako používať VisualVM v spojení s JMX a MBeans podobným spôsobom ako JConsole. Tento príspevok v blogu sa zameriava na to, ako možno VisualVM použiť na generovanie a analýzu výpisu haldy podobným spôsobom, aký sa robí pomocou nástrojov príkazového riadku jmap a jhat.

Nástroj jmap (Java Memory Map) je jedným z niekoľkých spôsobov, ako je možné vygenerovať výpis haldy Java. Stránka TechNotes / man nástroja Java Heap Analysis Tool (jhat) uvádza štyri spôsoby generovania výpisu haldy, ktoré je možné analyzovať pomocou jhat. Štyri uvedené spôsoby generovania výpisu haldy sú použitie jmap, JConsole (Java Monitoring and Management Console), HPROF, a keď dôjde k OutOfMemoryError, keď -XX: + HeapDumpOnOutOfMemoryError Bola zadaná možnosť VM. Piaty prístup, ktorý nie je uvedený v zozname, ale je ľahko použiteľný, je Java VisualVM. (Mimochodom, ďalšou metódou je použitie nástroja MXBean s názvom HotSpotDiagnosticMXBean a jeho metóda dumpHeap (String, Boolean).)

The jmap nástroj je jednoduchý na použitie z príkazového riadku na vytvorenie haldy. Môže sa použiť proti spustenému procesu Java, ktorého ID piocesu (pid) je známe (dostupné cez jps), alebo proti základnému súboru. V tomto príspevku sa budem venovať používaniu jmap s ID bežiaceho procesu.

Stránka jmap to uvádza jmap je experimentálny nástroj s relatívne obmedzenými schopnosťami v systéme Windows, ktorý nemusí byť v budúcich verziách JDK k dispozícii. Táto stránka obsahuje aj zoznam dostupných možností na určenie spôsobu jmap by mal vygenerovať výpis haldy.

Nasledujúca snímka obrazovky ukazuje, ako na to jmap možno použiť na odloženie hromady.

Vygenerovaný výpisový súbor, poprašok.bin v tomto prípade je binárny, ako je znázornené na nasledujúcej snímke obrazovky.

Binárny výpis haldy je možné prečítať pomocou jhat nástroj. Aplikácia Sun Java SE 6 zahŕňala implementáciu jhat nahrádza HAT, ktorý bol predtým k dispozícii ako samostatné stiahnutie. Spustiť je takmer triviálne jhat. Stačí sa len dovolať jhat na súbore haldy výpisu vygenerovanom pomocou jmap (alebo alternatívna technika generovania výpisu), ako je znázornené na nasledujúcej snímke obrazovky.

S vygenerovanou skládkou (jmap) a jhat vyvolaný nástrojom, výpis je možné analyzovať pomocou webového prehľadávača. Výstup na konzole nám hovorí, že výpis je k dispozícii na porte 7000 (tento predvolený port je možné prepísať príkazom -port možnosť). Keď spustím prehliadač na rovnakom stroji, na ktorom som bežal jhat, Môžem použiť localhost pre hostiteľskú časť adresy URL. Úvodná stránka používajúca localhost a port 7000 sa zobrazuje na nasledujúcej snímke obrazovky.

Na nájdenie potrebných podrobností vo výpisu haldy je možné písať príkazy OQL (Arbitrary Object Query Language). The jhat-štartovaný webový server obsahuje OQL pomoc na URL // localhost: 7000 / oqlhelp /. Viac podrobností o používaní OQL nájdete v časti Dotaz na haldu Java s OQL. Avšak často je možné nájsť to, čo potrebujete, jednoducho pomocou už poskytnutých informácií a presunu medzi informáciami pomocou poskytnutých hypertextových odkazov.

Nasledujúca snímka obrazovky demonštruje jednu z užitočnejších stránok dostupných vďaka jhatvýstup haldy výpisu založený na webovom serveri. Táto stránka zobrazuje počet inštancií rôznych objektov Java vrátane objektov platformy.

Významná pomôcka pri porozumení toho, čo tieto webové stránky generujú jhat priemer je špecifikácia VM vo formáte súboru triedy. V oddiele 4.3.2 („Deskriptory polí“) tohto dokumentu je tabuľka, ktorá zobrazuje mapovanie znakov deskriptorov polí na dátový typ, ktorý používame. Podľa tejto tabuľky „B“ označuje a bajt„C“ označuje a char, „D“ označuje a dvojitý, „F“ označuje a plavák„I“ označuje znak celé číslo, „J“ označuje a dlho„L“ označuje odkaz (inštanciu triedy), „Z“ označuje a booleana [ označuje pole.

Doteraz som sa pozeral na používanie jmap a jhat z príkazového riadku vygenerovať výpis haldy a poskytnúť metódu analýzy vygenerovaného výpisu haldy založenú na webovom prehliadači. Aj keď sa tieto nástroje používajú pomerne ľahko, VisualVM poskytuje podobné funkcie v ešte ľahšom prístupe.

Jednou z metód na generovanie výpisu haldy vo Visual VM je jednoduché kliknutie pravým tlačidlom myši na požadovaný proces a výber „Heap Dump“. Táto metóda je zobrazená na nasledujúcej snímke obrazovky.

Toto vygeneruje výpis haldy, ako to naznačuje jeho názov pod procesom Java.

Druhým prístupom na generovanie výpisu haldy pomocou VisualVM je kliknutie na požadovaný proces Java, aby sa vo VisualVM objavili príslušné karty („Overview“, „Monitor“, „Threads“ a „Profiler“). Výber karty „Monitor“ poskytuje tlačidlo „Heap Dump“, ako je to znázornené na nasledujúcej snímke obrazovky.

Kliknutím na tlačidlo „Heap Dump“ dôjde k vygenerovaniu haldy, rovnako ako tomu bolo pri možnosti kliknutia pravým tlačidlom popísanej vyššie. Toto sa zobrazuje na nasledujúcej snímke obrazovky, ktorá sa v tomto prípade zobrazí na karte „Zhrnutie“ analyzovaného výpisu haldy.

Okrem karty „Súhrn“ analýzy haldy sú na karte „Trieda“ uvedené ďalšie zaujímavé podrobnosti z haldy. Táto karta obsahuje vodorovné pruhové grafy, ktoré graficky označujú percento z celkového počtu inštancií, ktoré sú spojené s každou triedou. Príklad je uvedený na nasledujúcej snímke obrazovky.

Zobrazené triedy sú vysvetlené skôr, ako by sa mali používať symboly, ako sú tie, ktoré sú popísané vyššie pre jhat- analýza haldy na základe haldy. Jeden môže kliknúť pravým tlačidlom myši na ľubovoľnú triedu na karte „Triedy“ a zvoliť možnosť „Zobraziť v zobrazení inštancií“, aby sa zobrazili podrobnosti o každej jednotlivej inštancii vybranej triedy. Toto sa zobrazuje na nasledujúcej snímke obrazovky.

Záver

VisualVM poskytuje niekoľko výhod pri vytváraní a analýze výpisov haldy. Po prvé, všetko od vytvorenia po analýzu je na jednom mieste. Po druhé, údaje sa poskytujú v tom, čo sa dá považovať za prezentovateľnejší formát s grafickou podporou. Napokon možno vo VisualVM použiť aj ďalšie nástroje v spojení s analýzou haldy. VisualVM poskytuje komplexné nakupovanie pre množstvo vývojových, ladiacich a výkonnostných analytických potrieb vývojára Java.

Ďalšie odkazy

⇒ Riešenie problémov s Java SE

⇒ Sprievodca riešením problémov pre Java SE 6 s HotSpot JVM (PDF)

⇒ Biela kniha o výkone Java SE 6

⇒ Čo je v mojej halde Java?

⇒ Analýza hromád Java pomocou súborov jmap a jhat

⇒ Profilovanie pamäte Java pomocou súborov jmap a jhat

Tento príbeh, „Heap Dump and Analysis with VisualVM“, bol pôvodne publikovaný spoločnosťou JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found