Мне нужно создать heapdump, который отлично работает с jmap. Моя проблема в том, что jmap очень долго создает файл heapdump. Особенно когда куча становится больше (> 1 ГБ), это занимает слишком много времени.
Одна ситуация в качестве примера:
Когда у сервера возникают проблемы с пространством кучи, я хочу перезапустить его автоматически и создать дамп кучи перед перезапуском. Это работает, но запись кучи занимает слишком много времени. Таким образом, сервер не работает слишком долго. Создание дампа кучи занимает больше часа.
Я знаю о -XX:+HeapDumpOnOutOfMemoryError
, но в большинстве случаев я могу найти проблему с памятью до того, как jvm создаст исключение.
Есть ли альтернатива jmap, которая быстрее записывает кучи?
Также будет оценено специальное решение для приведенного выше примера.
Этот вопрос представляет собой смесь программирования и системного администрирования, но я думаю, что здесь я попал в нужное место.
я нашел ответ на свой вопрос. этот Ответ на другой вопрос о serverfault подсказал мне идею.
gdb --pid=<your java pid>
gcore <file name>
detach
quit
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'.