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