Programmering

Heap Dump og analyse med VisualVM

I tidligere blogginnlegg har jeg dekket bruk av VisualVM for å skaffe HotSpot JVM kjøretidsinformasjon på en måte som ligner på jinfo og hvordan du bruker VisualVM i forbindelse med JMX og MBeans på en måte som ligner på JConsole. Dette blogginnlegget ser på hvordan VisualVM kan brukes til å generere og analysere en heap dump på en måte som ligner på det som gjøres med kommandolinjeverktøyene jmap og jhat.

Verktøyet jmap (Java Memory Map) er en av flere måter en Java-heap dump kan genereres på. Java Heap Analysis Tool (jhat) TechNotes / man-siden viser fire metoder for å generere en heap dump som kan analyseres av jhat. De fire oppførte metodene for å generere en dyngdump er bruken av jmap, JConsole (Java Monitoring and Management Console), HPROF, og når en OutOfMemoryError oppstår når -XX: + HeapDumpOnOutOfMemoryError VM-alternativet er spesifisert. En femte tilnærming som ikke er oppført, men som er enkel å bruke, er Java VisualVM. (For øvrig er en annen metode bruk av MXBean kalt HotSpotDiagnosticMXBean og dens dumpHeap (String, Boolean) -metode.)

De jmap verktøyet er enkelt å bruke fra kommandolinjen for å produsere en heap dump. Den kan brukes mot en kjørende Java-prosess hvis piocess-ID (pid) er kjent (tilgjengelig via jps) eller mot en kjernefil. I dette innlegget vil jeg fokusere på bruk jmap med en kjørende prosess ID.

Det viser jmap-siden jmap er et eksperimentelt verktøy med relativt begrensede muligheter på Windows som kanskje ikke er tilgjengelig med fremtidige versjoner av JDK. Denne siden viser også tilgjengelige alternativer for å spesifisere hvordan jmap skulle generere en dyngdump.

Følgende skjermbilde viser hvordan jmap kan brukes til å dumpe en haug.

Den genererte dumpfilen, dustin.bin i dette tilfellet er det binært som vist i neste skjermbilde.

Den binære heap dump kan leses med jhat verktøy. Suns Java SE 6 inkluderte implementering av jhat erstatter HAT, som tidligere var tilgjengelig som en separat nedlasting. Det er nesten trivielt å løpe jhat. Man trenger bare påberope seg jhat på heap dump-filen generert med jmap (eller alternativ dump-genereringsteknikk) som vist i neste skjermbilde.

Med heap dump generert (jmap) og jhat verktøy påberopt, kan dumpen analyseres med en nettleser. Utgangen på konsollen forteller oss at dumpen er tilgjengelig på port 7000 (denne standardporten kan overstyres med -havn alternativ). Når jeg kjører nettleseren på samme maskin som jeg kjørte på jhat, Jeg kan bruke lokal vert for vertsdelen av URL-en. Startsiden ved hjelp av localhost og port 7000 vises i neste skjermbilde.

Arbitrary Object Query Language (OQL) uttalelser kan skrives for å finne nødvendige detaljer i bunndumpen. De jhat-startet webserver inkluderer OQL-hjelp på URL // localhost: 7000 / oqlhelp /. Se også Spørring av Java Heap med OQL for mer informasjon om hvordan du bruker OQL. Imidlertid kan man ofte finne det man trenger bare ved å bruke den allerede oppgitte informasjonen og flytte mellom informasjonen ved hjelp av de medfølgende hyperlinkene.

Følgende skjermbilde viser en av de mer nyttige sidene som er tilgjengelige takket være jhat's webserverbaserte utdata fra heap dump. Denne siden viser antall forekomster av forskjellige Java-objekter, inkludert plattformobjekter.

Et viktig hjelpemiddel for å forstå hva disse websidene genererer av jhat mener er VM-spesifikasjonen for klassefilformat. I avsnitt 4.3.2 ("Feltbeskrivere") i dette dokumentet er det en tabell som viser tilordning av feltbeskrivelsestegn til datatypen vi bruker. I følge denne tabellen indikerer "B" a byte, "C" indikerer a røye, "D" indikerer a dobbelt, "F" indikerer a flyte, "I" indikerer en heltall, "J" indikerer a lang, "L" indikerer en referanse (forekomst av en klasse), "Z" indikerer en boolsk, og [ indikerer en matrise.

Så langt har jeg sett på å bruke jmap og jhat fra kommandolinjen for å generere en heap dump og gi en nettleserbasert metode for å analysere den genererte heap dumpen. Selv om disse verktøyene er relativt enkle å bruke, gir VisualVM lignende funksjonalitet i en enda enklere tilnærming.

En metode for å generere en heap dump i Visual VM er å bare høyreklikke på ønsket prosess og velge "Heap Dump". Denne metoden vises i neste skjermbilde.

Dette genererer heap dump som angitt av navnet under Java-prosessen.

En annen tilnærming for å generere en heap dump med VisualVM er å klikke på Java-prosessen av interesse slik at relevante faner ("Oversikt", "Monitor", "Tråder" og "Profiler") kommer opp i VisualVM. Å velge "Monitor" -fanen gir "Heap Dump" -knappen som vist på neste skjermbilde.

Hvis du klikker på "Heap Dump" -knappen, blir det generert en heap dump akkurat som den var med alternativet for høyreklikk beskrevet ovenfor. Dette vises i det neste skjermbildet, som i dette tilfellet viser fanen "Sammendrag" i den analyserte dyngdumpen.

I tillegg til "Sammendrag" -fanen i dyppeanalysen, presenteres andre interessante detaljer fra dyngdumpen i kategorien "Klasse". Denne kategorien inneholder horisontale stolpediagrammer som grafisk viser prosentandelen av totale forekomster som er knyttet til hver klasse. Et eksempel vises i neste skjermbilde.

De viste klassene er stavet fremfor å bruke symboler som de som er beskrevet ovenfor for jhat-basert heap dump analyse. Man kan høyreklikke på en hvilken som helst klasse i kategorien "Klasser" og velge "Vis i instansvisning" for å se detaljer om hver enkelt forekomst av den valgte klassen. Dette vises i neste skjermbilde.

Konklusjon

VisualVM gir flere fordeler når du oppretter og analyserer dyppedumper. For det første er alt fra skapelse til analyse på ett sted. For det andre leveres dataene i det som kan betraktes som et mer presentabelt format med grafisk støtte. Til slutt kan andre verktøy også brukes i VisualVM i forbindelse med heap dump-analysen. VisualVM gir one-stop shopping for mange av utviklings-, feilsøkings- og ytelsesanalysebehovene til Java-utvikleren.

Ytterligere referanser

⇒ Feilsøking av Java SE

⇒ Feilsøkingsveiledning for Java SE 6 med HotSpot JVM (PDF)

⇒ Java SE 6 Performance White Paper

⇒ Hva er i Java Heap?

⇒ Analysere Java-dynger med jmap og jhat

⇒ Java-minneprofilering med jmap og jhat

Denne historien, "Heap Dump and Analysis with VisualVM" ble opprinnelig utgitt av JavaWorld.

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