Обычно то, что я использую, 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 не потребует такого количества памяти.
- Выполнение этого в сценарии оболочки означает, что я могу сделать это на безголовом сервере (и обычно я также делаю это на безголовом сервере, потому что они обычно самые мощные). И если у вас есть сервер, который может создавать дамп кучи такого размера, скорее всего, у вас есть другой сервер, который также может обрабатывать такую большую часть дампа кучи.
ArrayIndexOutOfBoundsException
Особенности в по крайней мере двух ошибок . Я говорю об этом, потому что вы не сообщали об OOME при запуске MAT, который имеет другое исправление .