Как мне проанализировать файл .hprof?

227

У меня есть рабочий сервер со следующим флагом: - XX: + HeapDumpOnOutOfMemoryError

Вчера вечером он сгенерировал файл java-38942.hprof, когда наш сервер обнаружил ошибку кучи. Оказывается, разработчики системы знали о флаге, но никак не могли получить от него полезную информацию.

Любые идеи?

Ник Стинамантес
источник

Ответы:

215

Если вам нужен довольно продвинутый инструмент для серьезной работы, посмотрите на проект Memory Analyzer в Eclipse, предоставленный им SAP.

Кое-что из того, что вы можете сделать, невероятно хорошо для обнаружения утечек памяти и т. Д., Включая запуск формы ограниченного SQL (OQL) для объектов в памяти, т.е.

ВЫБЕРИТЕ toString (firstName) ОТ com.yourcompany.somepackage.User

Совершенно блестящий.

Коуэн
источник
18
Я просто хотел бы добавить +100 для Eclipse Memory Analyzer. В настоящее время я пытаюсь просеять файл дампа кучи размером 400 Мб, и для его прочтения потребовалось более 70 минут, прежде чем он вызвал полный сбой JVM. EMA может открыть его в течение <5 минут.
Мэтт Б
3
Я продолжаю получать ошибки синтаксического анализа при открытии файлов HPROF с помощью Eclipse Memory Analyzer (которые фактически были также выгружены Eclipse!). Несчастный .. вздох.
lost_bits1110
3
MAT все еще может потребовать немного оперативной памяти [меньше, чем JHAT, но все же совсем немного]. См. Stackoverflow.com/questions/7254017/… для подсказок, если вы столкнетесь с этим случаем.
rogerdpack
71

Вы можете использовать JHAT , инструмент анализа кучи Java, предоставляемый по умолчанию вместе с JDK. Это командная строка, но запускается веб-сервер / браузер, который вы используете для проверки памяти. Не самый удобный для пользователя, но, по крайней мере, он уже установлен в большинстве мест, куда вы пойдете. Очень полезным представлением является ссылка «гистограмма кучи» в самом низу.

например: jhat -port 7401 -J-Xmx4G dump.hprof

jhat также может выполнять OQL «в эти дни» (нижняя ссылка «выполнить OQL»)

CMS
источник
После выполнения вышеуказанной команды В консоли вы получите сообщение в терминале «сервер готов» Порт: 7401. После этого откройте этот URL: localhost: 7401 «вы можете увидеть детали в окнах браузера».
Лаксман Дж
35

Вы также можете использовать HeapWalker из Netbeans Profiler или автономный инструмент Visual VM . Visual VM - хорошая альтернатива JHAT, поскольку она автономна, но ее гораздо проще использовать, чем JHAT.

Вам нужна Java 6+, чтобы полностью использовать Visual VM.

Джеймс Шек
источник
Вы должны добавить примечание, что это только для Java 6 и 7.
Ник Stinemates
AFAIK, HeapWalker и VisualVM не требуют Java 6/7 для чтения файлов HPROF.
Джеймс Шек
Я просто попытался загрузить его с помощью Java 5, и он сказал: «Пожалуйста, используйте Java 6 или 7». Что я делаю не так?
Ник Stinemates
Хм. Возможно, вам нужно запустить Java 6, но вы можете прочитать Java 5 HPROF (возможно, именно так я и начал работать). Я знаю, что вы не можете создать дамп кучи из Visual VM в приложении под управлением Java 5. Обновится.
Джеймс Шек
Вы также можете использовать визуальную JVM из Java SDK - ищите jvisualvm.exeв JAVASDK/binпапке
xxxvodnikxxx
11

Просто получите анализатор памяти Eclipse . Там нет ничего лучше, и это бесплатно.

JHAT можно использовать только для «игрушечных приложений»

kohlerm
источник
3
JHAT необходим для того, чтобы произвести впечатление на тех «хакеров 1333 года», которые вручную создают дистрибутив BSD, начиная с LILO. Подождите ... они бы никогда не использовали Java. :-)
Джеймс Шек
Я думаю, что это больше комментарий ...: \
rogerdpack
10

YourKit Java Profiler, похоже, справляется и с ними.

полярная звезда
источник
5

Если вы хотите выполнить пользовательский анализ вашей heapdump, то есть:

Эта библиотека быстрая, но вам нужно будет написать свой код анализа на Java.

Из документов:

  • Не создает никаких временных файлов на диске для обработки дампа кучи
  • Может работать напрямую GZ, сжатые отвалы кучи
  • Обозначение HeapPath
Андрейс
источник
2

Я лично предпочитаю VisualVM. Одна из функций, которые мне нравятся в VisualVM, - сравнение дампов кучи. Когда вы выполняете анализ дампа кучи, есть несколько способов выяснить, что вызвало сбой. Один из способов, которые я нашел полезными, - это сравнение здоровых и нездоровых дампов кучи.

Ниже приведены шаги, которые вы можете выполнить для этого:

  1. Получая дамп кучи из OutOfMemoryError, назовем его «oome.hprof». Вы можете получить это через параметр JVM HeapDumpOnOutOfMemoryError.
  2. Перезапустите приложение и дайте ему поработать долго (минуты / часы) в зависимости от вашего приложения. Получить еще один дамп кучи, пока приложение еще работает. Давайте назовем это «healthy.hprof».
  3. Вы можете открыть оба этих дампа в VisualVM и выполнить сравнение дампов кучи. Вы можете сделать это на уровне класса или пакета. Это часто может указывать вам направление проблемы.

ссылка: https://visualvm.github.io

Валид
источник