Programmering

Heap Dump og analyse med VisualVM

I tidligere blogindlæg har jeg dækket ved hjælp af VisualVM til at erhverve HotSpot JVM-runtime-oplysninger på en måde, der ligner jinfo, og hvordan man bruger VisualVM i forbindelse med JMX og MBeans på en måde svarende til JConsole. Denne blogindlæg ser på, hvordan VisualVM kan bruges til at generere og analysere en bunke dump på en måde svarende til den, der gøres med kommandolinjeværktøjer jmap og jhat.

Værktøjet jmap (Java Memory Map) er en af ​​flere måder, hvorpå en Java-heap-dump kan genereres. Java Heap Analysis Tool (jhat) TechNotes / man-siden viser fire metoder til generering af en bunke dump, der kan analyseres af jhat. De fire anførte metoder til generering af en bunke dump er brugen af jmap, JConsole (Java Monitoring and Management Console), HPROF, og når der opstår en OutOfMemoryError, når -XX: + HeapDumpOnOutOfMemoryError VM-indstilling er blevet specificeret. En femte tilgang, der ikke er angivet, men som er nem at bruge, er Java VisualVM. (Forresten er en anden metode brug af MXBean kaldet HotSpotDiagnosticMXBean og dens dumpHeap (String, Boolean) metode.)

Det jmap værktøj er nemt at bruge fra kommandolinjen til at producere en bunke dump. Det kan bruges mod en kørende Java-proces, hvis piocess-id (pid) er kendt (tilgængelig via jps) eller mod en kernefil. I dette indlæg vil jeg fokusere på at bruge jmap med en kørende proces-ID.

Det vises på jmap-siden jmap er et eksperimentelt værktøj med relativt begrænsede muligheder på Windows, som muligvis ikke er tilgængeligt med fremtidige versioner af JDK. Denne side viser også tilgængelige muligheder for at specificere hvordan jmap skulle generere en bunke dump.

Følgende skærmbillede viser hvordan jmap kan bruges til at dumpe en bunke.

Den genererede dumpfil, dustin.bin i dette tilfælde er det binært som vist i næste skærmbillede.

Binær bunke dump kan læses med jhat værktøj. Suns Java SE 6 inkluderede implementering af jhat erstatter HAT, som tidligere var tilgængelig som en separat download. Det er næsten trivielt at løbe jhat. Man behøver kun at påberåbe sig jhat på heap dump-filen genereret med jmap (eller alternativ dumpgenereringsteknik) som vist i næste skærmbillede.

Med genereret bunke-dump (jmap) og jhat værktøj, der påberåbes, kan dumpen analyseres med en webbrowser. Outputtet på konsollen fortæller os, at dumpen er tilgængelig på port 7000 (denne standardport kan tilsidesættes med -Havn mulighed). Når jeg kører browseren på den samme maskine, som jeg løb på jhat, Kan jeg bruge lokal vært til værtsdelen af ​​URL'en. Startsiden ved hjælp af localhost og port 7000 vises i næste skærmbillede.

OCR-udsagn (Arbitrary Object Query Language) kan skrives for at finde nødvendige detaljer i bunke-dumpen. Det jhat-startet webserver inkluderer OQL-hjælp på URL'en // localhost: 7000 / oqlhelp /. Se også Forespørgsel om Java Heap med OQL for at få flere oplysninger om, hvordan du bruger OQL. Imidlertid kan man ofte finde, hvad man har brug for ved blot at bruge de allerede leverede oplysninger og flytte mellem stykker information ved hjælp af de medfølgende hyperlinks.

Følgende skærmbillede viser et af de mere nyttige sider, der er tilgængelige takket være jhat's webserverbaserede output af heap dump. Denne side viser antallet af forekomster af forskellige Java-objekter, inklusive platformobjekter.

En vigtig hjælp til at forstå, hvad disse websider genereres af jhat middelværdi er VM-specifikationen for klassefilformat. I afsnit 4.3.2 ("Feltbeskrivere") i dette dokument er der en tabel, der viser kortlægningen af ​​feltbeskrivelsestegn til den datatype, vi bruger. Ifølge denne tabel angiver "B" en byte, "C" angiver en char, "D" angiver en dobbelt, "F" angiver en flyde, "I" angiver en heltal, "J" angiver en lang, "L" angiver en reference (forekomst af en klasse), "Z" angiver en boolskog [ angiver en matrix.

Indtil videre har jeg set på at bruge jmap og jhat fra kommandolinjen til at generere en bunke dump og give en webbrowser-baseret metode til analyse af den genererede bunke dump. Selvom disse værktøjer er relativt lette at bruge, giver VisualVM lignende funktionalitet i en endnu lettere tilgang.

En metode til generering af en bunke-dump i Visual VM er at højreklikke på den ønskede proces og vælge "Heap Dump". Denne metode vises i det næste skærmbillede.

Dette genererer bunke-dump som angivet ved navnet under Java-processen.

En anden tilgang til generering af en bunke-dump med VisualVM er at klikke på Java-processen af ​​interesse, så relevante faner ("Oversigt", "Monitor", "Tråde" og "Profiler") kommer op i VisualVM. Valg af "Monitor" -fanen giver "Heap Dump" -knappen som vist i det næste skærmbillede.

Ved at klikke på "Heap Dump" -knappen, føres der til, at der genereres en bunke dump, som det var med højre klik mulighed beskrevet ovenfor. Dette vises i det næste skærmbillede, hvilket i dette tilfælde viser fanen "Oversigt" i den analyserede bunke dump.

Ud over fanen "Resumé" i analysen af ​​bunke-dump præsenteres andre interessante detaljer fra bunke-dumpen i fanen "Klasse". Denne fane indeholder vandrette søjlediagrammer, der grafisk angiver procentdelen af ​​de samlede forekomster, der er knyttet til hver klasse. Et eksempel vises i det næste skærmbillede.

De viste klasser er stavet frem for at bruge symboler som beskrevet ovenfor for jhat-baseret bunke dump analyse. Man kan højreklikke på en hvilken som helst klasse i fanen "Klasser" og vælge "Vis i instansvisning" for at se detaljer om hver enkelt forekomst af den valgte klasse. Dette vises i det næste skærmbillede.

Konklusion

VisualVM giver flere fordele, når der oprettes og analyseres bunke dumps. For det første er alt fra skabelse til analyse ét sted. For det andet leveres dataene i det, der kan betragtes som et mere præsentabelt format med grafisk understøttelse. Endelig kan andre værktøjer også bruges i VisualVM i forbindelse med heap dump-analysen. VisualVM giver one-stop shopping for mange af udviklings-, fejlretnings- og ydeevne-analysebehovene hos Java-udvikleren.

Yderligere referencer

⇒ Fejlfinding af Java SE

⇒ Fejlfindingsvejledning til Java SE 6 med HotSpot JVM (PDF)

SE Java SE 6 Performance White Paper

⇒ Hvad er der i min Java Heap?

⇒ Analyse af Java Heaps med jmap og jhat

⇒ Java-hukommelsesprofilering med jmap og jhat

Denne historie, "Heap Dump and Analysis with VisualVM" blev oprindeligt udgivet af JavaWorld.