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