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

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

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

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

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

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

1 ответ

Решение

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

  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'.

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

РЕДАКТИРОВАТЬ:
когда вы получаете следующее сообщение об ошибке, возможно, вы указали неверный двоичный файл 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'.
Другие вопросы по тегам