Альтернативы для создания дампов кучи с более высокой производительностью, чем jmap?

Альтернативы для создания дампов кучи с более высокой производительностью, чем jmap?

Мне нужно создать heapdumps, что отлично работает с jmap. Моя проблема в том, что jmap очень долго создает файл heapdump. Особенно когда heap становится больше (> 1 ГБ), это занимает слишком много времени.

Пример одной ситуации:
когда сервер сталкивается с проблемами с кучей, я хочу перезапустить его автоматически и создать дамп кучи перед перезапуском. Это работает, но запись дампа кучи занимает слишком много времени. Таким образом, сервер слишком долго простаивает. Создание дампа кучи занимает больше часа.

Я знаю об этом -XX:+HeapDumpOnOutOfMemoryError, но в большинстве случаев я могу обнаружить проблему с памятью до того, как jvm выдаст исключение.

Есть ли альтернатива jmap, которая записывает heapdumps быстрее?
Специальное решение для примера выше также было бы полезно.

Этот вопрос представляет собой смесь программирования и системного администрирования, но я думаю, что я попал по адресу.

решение1

Я нашел ответ на свой вопрос. этотОтвет на другой вопрос на serverfault натолкнул меня на эту идею.

  1. подключитесь с помощью gdb к вашему процессу java
    gdb --pid=<your java pid>
  2. создать дамп ядра из gdb
    gcore <file name>
    detach
    quit
  3. перезапустите процесс Java или сделайте то, что вам нравится
  4. создайте дамп кучи из дампа ядра, подключив jmap к дампу ядра
    jmap -heap:format=b <path to java binary> <core dump file>

На шаге 4 крайне важно указать правильный двоичный файл Java, иначе jmap не сможет подключиться к дампу ядра. Если вы не уверены, какой двоичный файл использовался для процесса Java, откройте дамп ядра с помощью gdb:
gdb --core=<core dump file>
Там будет строка вроде этой, указывающая полный путь:
Core was generated by '/opt/tomcat/bin/jsvc'.

Создание дампа памяти происходит гораздо быстрее, чем создание дампа кучи напрямую через jmap. Таким образом, вы можете создать дамп кучи процесса Java без слишком длительных простоев.

EDIT:
если вы получаете следующее сообщение об ошибке, возможно, вы указали неправильный двоичный файл Java:

Error attaching to core file: Can't attach to the core file

Чтобы получить правильный двоичный файл Java для вызова jmap, откройте дамп ядра с помощью gdb:

gdb --core=[path tp core file]

будет такая строка, сообщающая вам правильный двоичный файл:

Core was generated by `/opt/tomcat/bin/jsvc'.

Связанный контент