2010-04-28 1 views
4

Ну, это неловко ...Расположение файла кучи дампа Java при использовании jconsole?

Я начинаю играть с анализатором памяти Eclipse, чтобы искать утечки памяти Java в окне Windows. Шаг 1 - получить файл дампа кучи. Для этого я запускаю свой Java (javaw.exe) процесс из Eclipse и подключаюсь к нему с помощью jconsole. Затем на вкладке MBeans jconsole нажмите кнопку dumpHeap. В первый раз, когда я это сделал, я увидел всплывающее сообщение о том, что он создал файл дампа кучи, но не дал его имени или местоположения. Теперь всякий раз, когда я делаю dumpHeap снова при подключении к другому процессу javaw.exe, JConsole говорит:

Problem invoking dumpHeap : java.io.IOException: File exists 

и, конечно, не дает его имя или путь. Где это может быть?

Я искал свой диск C: (используя инструменты командной строки cygwin) для файлов, содержащих «hprof» или «java_pid» или «heapdump», и не нашел ничего правдоподобного. Я даже использовал поиск Windows для поиска всех файлов в рабочей области Eclipse, которые были изменены в последний день.

Я использую JVM Sun Java 1.6 и не имею -XX: набор HeapDumpPath.

Обновление (28 апреля 2010 г.): Мое первоначальное местоположение файла кучи должно быть определено jconsole, инструмент, с которого я запускал кучу кучи. Местоположение дампа кучи JVM должно применяться только к дампам кучи, которые он запускает (например, в OutOfMemoryException).

Предложение Мэтта использовать jvisualvm прекрасно решает мою проблему, указывая мне на гораздо более полезную замену старой jconsole. У этого есть хороший профилировщик памяти, который показывает, какие типы объектов являются самыми многочисленными и хранят большую часть памяти. И у этого есть монитор, который показывает фактическое использование памяти с течением времени. Когда вы спросите его о дампе кучи, он сообщает вам имя файла даже! Анализатор памяти Eclipse дает вам полную информацию.

+0

попробуйте jvisualvm, у него есть намного лучший интерфейс –

+0

IDE действительно полезны, пока они не будут –

+0

@matt b: Вы абсолютно правы, и это даже говорит мне, что имя файла после кучи дампа! C: \ DOCUME ~ 1 \ ferrans \ LOCALS ~ 1 \ Temp \ visualvm.dat \ localhost-4180 \ heapdump-1272470561431.hprof Добавьте это как ответ, и я его приму. –

ответ

8

Попробуйте jvisualvm, он имеет гораздо лучший интерфейс.

Обратите внимание, что начиная с версии JDK версии 6, версии 7 или выше, Java VisualVM поставляется вместе с JDK. См. here.

+0

Спасибо, это решило мою проблему * и * научило меня чему-то новому и очень полезному! –

2

Вы всегда можете использовать ProcessMonitor, чтобы увидеть, где он пытается писать :) Сделал это сам в прошлом.

+0

@Chris: Интересный совет, я попробую! –

4

Согласно docs для Sun Java SE6 JVM:

По умолчанию дамп кучи создается в файл с именем java_pid < PID> .hprof в рабочей директории VM

В Eclipse рабочий каталог определен на вкладке «Аргументы» диалогового окна «Запуск конфигурации». Значение по умолчанию - это тот же каталог, что и класс, который вы используете.

+0

Спасибо Джейсону, я посмотрю диалог Run Configurations. Мне не удалось создать второй файл дампа кучи для другого процесса, который, казалось бы, противоречит этой схеме именования. –

+0

Хмм, в текущем каталоге процесса не было файла hprof. Поскольку jvisualvm задает имя файла heapdump в другом каталоге, я полагаю, что jconsole тоже? –

6

Почему вы не устанавливаете первый параметр для dumpHeap (String, boolean) при попытке вызвать dumpHeap() из jconsole? это сгенерированное местоположение файла файла и файла файла heapdump.

0

Я нашел сфабрированный файл в ту же папку, где размещен файл .bat, запускающий мое приложение Java. (Я использую окна 8.1, java 7) В моем случае jboss,/jboss-as/bin/folder. Чтобы найти его, я искал * файлы, с сегодняшней датой создания и более 200 МБ.