Инструмент для анализа больших дампов кучи Java


80

У меня есть дамп кучи JVM HotSpot, который я хотел бы проанализировать. Виртуальная машина работала с -Xmx31g, а размер файла дампа кучи составляет 48 ГБ.

  • Я даже не буду пытаться jhat , так как он требует примерно в пять раз больше памяти кучи (в моем случае это было бы 240 ГБ) и работает очень медленно.
  • Eclipse MAT аварийно завершает работу ArrayIndexOutOfBoundsExceptionпосле нескольких часов анализа дампа кучи.

Какие еще инструменты доступны для этой задачи? Лучше всего подойдет набор инструментов командной строки, состоящий из одной программы, преобразующей дамп кучи в эффективные структуры данных для анализа, в сочетании с несколькими другими инструментами, работающими с предварительно структурированными данными.


Вы уверены, что дамп не поврежден и что вы используете более позднюю версию DTFJ JAR? ArrayIndexOutOfBoundsExceptionОсобенности в по крайней мере двух ошибок . Я говорю об этом, потому что вы не сообщали об OOME при запуске MAT, который имеет другое исправление .
Vineet Reynolds

jhat использует heapMap для хранения прочитанных объектов, которая экспоненциально растет с количеством объектов, хранящихся в куче. Один из вариантов - изменить декларацию с heapMap на TreeMap и запустить размер кучи jhat не меньше размера вашего процесса.
codeDr

Ответы:


80

Обычно то, что я использую, ParseHeapDump.shвключено в Eclipse Memory Analyzer и описано здесь , и я делаю это на одном из наших более мощных серверов (скачайте и скопируйте дистрибутив linux .zip, распакуйте его там). Для сценария оболочки требуется меньше ресурсов, чем для анализа кучи из графического интерфейса пользователя, к тому же вы можете запустить его на своем мощном сервере с большим количеством ресурсов (вы можете выделить больше ресурсов, добавив что-то вроде -vmargs -Xmx40g -XX:-UseGCOverheadLimitв конец последней строки сценария. Например, последняя строка этого файла может выглядеть так после модификации

./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit

Беги как ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof

После этого он создает ряд «индексных» файлов рядом с файлом .hprof.

После создания индексов я пытаюсь сгенерировать отчеты на их основе и скопировать эти отчеты на свои локальные машины и попытаться увидеть, смогу ли я найти виновника только по этому (не только в отчетах, не в индексах). Вот руководство по созданию отчетов .

Пример отчета:

./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

Другие варианты отчета:

org.eclipse.mat.api:overview и org.eclipse.mat.api:top_components

Если этих отчетов недостаточно, и если мне нужно еще немного покопаться (например, через oql), я переношу индексы, а также файл hprof на свой локальный компьютер, а затем открываю дамп кучи (с индексами в том же каталоге, что и дамп кучи) с моим графическим интерфейсом Eclipse MAT. Оттуда для работы не требуется слишком много памяти.

РЕДАКТИРОВАТЬ: Мне просто понравилось добавить две заметки:

  • Насколько мне известно, только генерация индексов является частью Eclipse MAT, интенсивно использующей память. После того, как у вас есть индексы, большая часть вашей обработки из Eclipse MAT не потребует такого количества памяти.
  • Выполнение этого в сценарии оболочки означает, что я могу сделать это на безголовом сервере (и обычно я также делаю это на безголовом сервере, потому что они обычно самые мощные). И если у вас есть сервер, который может создавать дамп кучи такого размера, скорее всего, у вас есть другой сервер, который также может обрабатывать такую ​​большую часть дампа кучи.

4
Важное примечание: ParseHeapDump.shпоставляется только с версией Linux, а не с версией OSX - eclipse.org/mat/downloads.php
Christopher

Когда я пробую это (ssh'd для bash на Linux), он сразу же терпит неудачу с "Невозможно инициализировать GTK +". Похоже, что (текущая версия, 2016-04-15) все еще думает, что обращается к пользовательскому интерфейсу (?).
Чарльз Рот

2
Хм, более новые версии ParseHeapDump.sh хотят запускать ./MemoryAnalyzer напрямую. Я экспериментирую с запуском пусковой установки непосредственно с java, пока, похоже, это работает, например java -Xmx16g -Xms16g -jar plugins / org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar -consoleLog -consolelog -application org.eclipse.mat.api.parse «$ @»
Чарльз Рот,

Похоже, вы можете использовать его в OS X, загрузив обе версии для Linux и OSX, затем скопируйте ParseHeapDump.sh в тот же каталог, что и ваш файл MemoryAnalyze (в моем случае ~ / Downloads / mat.app / Contents / MacOS) и измените и запустите это там. Или запустить его на каком-нибудь удаленном сервере, конечно, через SSH :)
rogerdpack

Открыл дамп кучи размером 2 ГБ с помощью графического интерфейса Eclipse Memory Analyzer, используя не более 500 МБ памяти. Индексные файлы создавались на лету при открытии файла (заняло ~ 30 секунд). Может, они улучшили инструмент. Это удобнее, чем копировать большие файлы туда и обратно, если действительно так работает. Небольшой объем памяти даже без консольных утилит - для меня большой плюс. Но, честно говоря, с действительно большими дампами (50+ ГБ) не пробовал . Очень интересно, сколько памяти требуется для открытия и анализа таких больших дампов с помощью этого инструмента.
Руслан Стельмаченко

6

Принятый ответ на этот связанный вопрос должен стать для вас хорошим началом (использует живые гистограммы jmap вместо дампов кучи):

Метод поиска утечки памяти в больших дампах кучи Java

Большинству других анализаторов кучи (я использую IBM http://www.alphaworks.ibm.com/tech/heapanalyzer ) требуется хотя бы на процент ОЗУ больше, чем кучи, если вы ожидаете хороший инструмент с графическим интерфейсом.

Помимо этого, многие разработчики используют альтернативные подходы, такие как анализ стека в реальном времени, чтобы понять, что происходит.

Хотя я должен спросить, почему у вас такие большие кучи? Влияние на распределение и сборку мусора должно быть огромным. Я готов поспорить, что большой процент того, что находится в вашей куче, на самом деле должен храниться в базе данных / постоянном кеше и т.д.


5

Предлагаю попробовать YourKit. Обычно ему требуется немного меньше памяти, чем размер дампа кучи (он индексирует его и использует эту информацию для получения того, что вы хотите)


4

Еще несколько вариантов:

Этот человек http://blog.ragozin.info/2015/02/programatic-heapdump-analysis.html

написал специальный анализатор кучи Netbeans, который просто предоставляет интерфейс "стиля запроса" через файл дампа кучи, вместо того, чтобы фактически загружать файл в память.

https://github.com/aragozin/jvm-tools/tree/master/hprof-heap

Хотя я не знаю, лучше ли «его язык запросов», чем Eclipse OQL, упомянутый в принятом ответе здесь.

JProfiler 8,1 ($ 499 для пользователя лицензии) также сказал , чтобы иметь возможность пересекать большие кучи , не используя много денег.


На самом деле работает на большом дампе, в отличие, скажем, от github.com/on-site/fasthat . Ницца!
Джесси Глик

4

Первый шаг: увеличьте объем оперативной памяти, выделяемой для MAT. По умолчанию это не так уж и много, и он не может открывать большие файлы.

В случае использования MAT на MAC (OSX) у вас будет файл MemoryAnalyzer.ini в MemoryAnalyzer.app/Contents/MacOS. У меня не получалось вносить изменения в этот файл и заставлять их «принимать». Вместо этого вы можете создать измененную команду запуска / сценарий оболочки на основе содержимого этого файла и запускать его из этого каталога. В моем случае мне нужна была куча 20 ГБ:

./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

Просто запустите эту команду / сценарий из каталога Contents / MacOS через терминал, чтобы запустить графический интерфейс с большим объемом доступной оперативной памяти.


Благодарю. Я зашел в утилиту сегодня. Пытался запустить с 2-кратным щелчком, и это дало ошибку. Посмотрел журнал, не смог создать файл данных и сказал использовать переключатель. Открыл пакет .app и обнаружил MemoryAnalyzer.ini в папке Eclipse \, а не в \ MacOS. Ага! Итак, я извлек все файлы локально и сделал, как вы предложили. Я создал файл .sh в \ MacOS и переместил в него команды из Eclipse \ MemoryAnalyzer.ini как одну плоскую строку. Сохраненный файл. Запустите файл .sh из MacOS \ в командной строке и вуаля, он сработал.
Мэтт Кэмпбелл

2

Не очень известный инструмент - http://dr-brenschede.de/bheapsampler/ хорошо работает для больших куч. Он работает путем выборки, поэтому ему не нужно читать все, хотя и немного привередливо.


К сожалению, в нем говорится: «Общая проблема: нехватка памяти: увеличьте -Xmx до 2/3 размера дампа», но я полагаю, что если у вас достаточно оперативной памяти или вы можете запустить ее на сервере с достаточным количеством, этого может быть достаточно, спасибо !
rogerdpack

2

Последняя сборка моментальных снимков Eclipse Memory Analyzer имеет возможность случайным образом отбрасывать определенный процент объектов, чтобы уменьшить потребление памяти и позволить анализировать оставшиеся объекты. См. Ошибку 563960 и сборку ночных снимков, чтобы протестировать эту возможность, прежде чем она будет включена в следующий выпуск MAT.


1

Это не решение для командной строки, но мне нравятся инструменты:

Скопируйте дамп кучи на сервер, достаточно большой, чтобы разместить его. Вполне возможно, что можно будет использовать исходный сервер.

Введите сервер через ssh -Xдля удаленного запуска графического инструмента и используйте jvisualvmиз двоичного каталога Java для загрузки.hprof файла дампа кучи.

Инструмент не загружает полный дамп кучи в память сразу, а загружает части, когда они требуются. Конечно, если вы достаточно осмотритесь в файле, необходимая память наконец достигнет размера дампа кучи.


0

Попробуйте использовать jprofiler, он хорошо работает при анализе больших .hprof, я пробовал с файлом размером около 22 ГБ.

https://www.ej-technologies.com/products/jprofiler/overview.html

0

Я наткнулся на интересный инструмент под названием JXray. Предоставляется ограниченная пробная ознакомительная лицензия. Было очень полезно найти утечки памяти. Вы можете попробовать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.