Назад | Перейти на главную страницу

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

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

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

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

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

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

я нашел ответ на свой вопрос. этот Ответ на другой вопрос о 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-процесса без слишком долгих простоев.

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