Изхвърляне на купчина и анализ с VisualVM

В предишни публикации в блога разгледах използването на VisualVM за придобиване на информация за изпълнение на HotSpot JVM по начин, подобен на jinfo, и как да използвам VisualVM заедно с JMX и MBeans по начин, подобен на JConsole. Това публикуване в блога разглежда как VisualVM може да се използва за генериране и анализ на сметище на купчина по начин, подобен на този, направен с инструментите за команден ред jmap и jhat.

Инструментът jmap (Java Memory Map) е един от няколкото начина, по които може да се генерира изхвърляне на купчина Java. Инструментът за анализ на купчина Java (jhat) TechNotes / man страница изброява четири метода за генериране на дъмп на купчина, които могат да бъдат анализирани от jhat. Четирите изброени метода за генериране на купчина са използването на jmapJConsole (Java конзола за наблюдение и управление), HPROF и когато възникне OutOfMemoryError, когато -XX:+HeapDumpOnOutOfMemoryErrorе посочена опцията VM. Петият подход, който не е в списъка, но е лесен за използване, е Java VisualVM. (Между другото, друг метод е използването на MXBean, наречен HotSpotDiagnosticMXBean и неговия dumpHeap (String, Boolean) метод.)

В jmapинструмента е лесна за използване от командния ред, за да се получи купчина сметище. Може да се използва срещу работещ Java процес, чийто piocess ID (pid) е известен (достъпен чрез jps) или срещу основен файл. В тази публикация ще се съсредоточа върху използването jmapс идентификатор на работещ процес.

Страницата jmap гласи, че jmapе експериментален инструмент с относително ограничени възможности за Windows, който може да не е достъпен с бъдещи версии на JDK. Тази страница също така изброява наличните опции, за да се посочи как jmapтрябва да се генерира купчина дъмп.

Следващата снимка на екрана показва как jmapможе да се използва за изхвърляне на купчина.

Генерираният файл за изхвърляне dustin.binв този случай е двоичен, както е показано на следващата снимка на екрана.

Двоичното изхвърляне на купчина може да се прочете с jhatинструмента. Sun's Java SE 6 включва внедряване на jhatзаместващ HAT, който преди беше достъпен като отделно изтегляне. Бегането е почти тривиално jhat. Трябва само да извикате jhatфайла за изхвърляне на купчина, генериран с jmap(или алтернативна техника за генериране на изхвърляне), както е показано на следващата снимка на екрана.

С генерирания дъмп на купчина ( jmap) и jhatизвикания инструмент, дъмпът може да бъде анализиран с уеб браузър. Изходът на конзолата ни казва, че дъмпът е наличен на порт 7000 (този порт по подразбиране може да бъде заменен с -portопцията). Когато стартирам браузъра на същата машина, на която съм работил jhat, мога да използвам localhostза хост частта на URL адреса. Началната страница, използваща localhost и порт 7000, е показана на следващата екранна снимка.

Могат да бъдат написани изрази за произволен обект на езика на заявките (OQL), за да се намерят необходимите подробности в купчината. Стартираният jhatуеб сървър включва помощ за OQL на URL // localhost: 7000 / oqlhelp /. Вижте също Заявка за Java Heap с OQL за повече подробности относно използването на OQL. Често обаче човек може да намери това, от което се нуждае, като просто използва вече предоставената информация и се придвижва между части от информация, използвайки предоставените хипервръзки.

Следващата моментна снимка на екрана демонстрира една от най-полезните страници, налични благодарение на jhatизхода на уеб сървъра, изведен от купчината. Тази страница показва броя на екземплярите на различни Java обекти, включително обекти на платформа.

Значителна помощ при разбирането на това, което тези уеб страници генерират по jhatсредата, е спецификацията на виртуалната машина за файлов формат на класа. В раздел 4.3.2 („Полеви дескриптори“) на този документ има таблица, която показва съпоставянето на символите на дескриптора на полето с типа данни, който използваме. Съгласно тази таблица, "B" означава a byte, "C" означава a char, "D" означава a double, "F" показва a float, "I" показва an integer, "J" означава a long, "L" означава препратка (екземпляр на клас), "Z" показва a booleanи [показва масив.

Досега разгледах използването jmapи jhatот командния ред за генериране на изхвърляне на купчина и предоставяне на метод, базиран на уеб браузър за анализ на генерирания изхвърляне на купчини. Въпреки че тези инструменти са относително лесни за използване, VisualVM предоставя подобна функционалност в още по-лесен подход.

Един от методите за генериране на купчина в Visual VM е просто да щракнете с десния бутон върху желания процес и да изберете "Heap Dump". Този метод е показан в следващата екранна снимка.

Това генерира сметището на купчина, както е посочено от името му под процеса на Java.

Вторият подход за генериране на сметище на купчина с VisualVM е да кликнете върху процеса на Java, който ви интересува, така че съответните раздели ("Общ преглед", "Монитор", "Нишки" и "Профайлър") да се появят в VisualVM. Избирането на раздела "Монитор" осигурява бутона "Heap Dump", както е показано на следващата екранна снимка.

Кликването върху бутона "Heap Dump" води до генериране на купчина, също както при описаната по-горе опция за десен бутон. Това е показано в следващата снимка на екрана, което в този случай се случва, за да се покаже раздела "Резюме" на анализирания дъмпинг.

В допълнение към раздела „Обобщение“ на анализа на изхвърлянето на купчина, в раздела „Клас“ са представени и други интересни подробности от сметището. Този раздел включва диаграми с хоризонтална лента, които графично показват процента от общия брой екземпляри, свързани с всеки клас. Пример е показан в следващата екранна снимка.

Показаните класове са изписани, вместо да се използват символи като тези, описани по-горе за jhatбазиран анализ на изхвърляне на купчина. Можете да щракнете с десния бутон върху който и да е клас в раздела „Класове“ и да изберете „Показване в изглед на екземпляри“, за да видите подробности за всеки отделен екземпляр на избрания клас. Това е показано в следващата екранна снимка.

Заключение

VisualVM предоставя няколко предимства при създаването и анализирането на купчини отпадъци. Първо, всичко от създаването до анализа е на едно място. Второ, данните се предоставят в това, което може да се счита за по-представителен формат с графична поддръжка. И накрая, други инструменти също могат да се използват в VisualVM заедно с анализа на изхвърлянето на купчина. VisualVM осигурява едно гише за много от нуждите на разработчика на Java за разработка, отстраняване на грешки и анализ на производителността.

Допълнителни справки

⇒ Отстраняване на неизправности в Java SE

⇒ Ръководство за отстраняване на неизправности за Java SE 6 с HotSpot JVM (PDF)

White Бяла книга за изпълнение на Java SE 6

⇒ Какво има в My Java Heap?

⇒ Анализиране на Java купчини с jmap и jhat

Prof Профилиране на Java памет с jmap и jhat

Тази история „Изхвърляне на купчина и анализ с VisualVM“ първоначално е публикувана от JavaWorld.