Снятие дампа памяти JVM. Standalone#

Документ определяет порядок снятия дампа памяти JVM на стенде, установленном в автономном (standalone) режиме. Действия выполняются штатными средствами JDK.

Параметр

Значение

Каталог установки

/opt/global/globalserver

Сервисы

global3, globalscheduler

Пользователь ОС

global

Версия JDK

21

1. Предварительные условия и ограничения#

  1. Объём файла дампа соответствует объёму занятой кучи. При установленном параметре -Xmx18G размер файла может достигать 18 ГБ. При недостаточном объёме свободного дискового пространства файл дампа будет повреждён.

  2. На время снятия дампа выполнение всех потоков JVM приостанавливается и производится полная сборка мусора. Для кучи объёмом 18 ГБ длительность операции составляет несколько минут. Операцию необходимо выполнять в согласованное технологическое окно.

  3. Команды выполняются от имени пользователя операционной системы, под которым запущен процесс (по умолчанию - global), либо от имени root. В противном случае подключение к JVM будет отклонено.

  4. Снятие дампа с JVM, уже находящейся в состоянии OutOfMemoryError, может завершиться неудачей. Дамп следует снимать до исчерпания памяти, пока сервер приложений сохраняет работоспособность.

2. Порядок действий#

Шаг 1. Определить идентификатор процесса#

Сервер приложений:

sudo systemctl show -p MainPID --value global3

Планировщик заданий, если требуется снятие дампа с него:

sudo systemctl show -p MainPID --value globalscheduler

Альтернативный способ:

pgrep -u global -f ru.bitec.starter.Main

Шаг 2. Подготовить каталог и проверить свободное место#

sudo mkdir -p /opt/global/dumps
sudo chown global:global /opt/global/dumps
df -h /opt/global/dumps

Объём свободного пространства должен быть не менее значения параметра -Xmx. Текущее значение определяется командой:

grep globalMemory /opt/global/globalserver/parameters.sh

Шаг 3. Снять дамп#

Вместо <PID> указывается идентификатор процесса, полученный на шаге 1.

sudo -u global jmap -dump:format=b,file=/opt/global/dumps/global3_$(date +%Y-%m-%d_%H-%M-%S).hprof <PID>

Если исполняемый файл jmap отсутствует в PATH, команда вызывается по полному пути из установленной JDK 21 - например /usr/lib/jvm/java-21-java/bin/jmap. Точный путь указан в журнале запуска сервера приложений в строке ru.bitec.starter.Main - java.home = .

По завершении операции необходимо убедиться, что файл создан и его размер отличен от нуля.

3. Оперативная диагностика без снятия дампа#

Для предварительной оценки состояния кучи без длительной приостановки сервера применяются следующие команды.

Команда

Назначение

jcmd <PID> GC.class_histogram

Перечень классов, упорядоченный по объёму занимаемой памяти

jcmd <PID> GC.heap_info

Текущее заполнение областей кучи

jcmd <PID> VM.flags

Действующие параметры JVM

jcmd <PID> Thread.print

Дамп потоков - состав выполняемых операций на текущий момент

Сведения о занятости пулов памяти доступны также в интерфейсе системы: Сервис → Мониторинг → вкладка «Узлы кластера», блок «Используемое пространство памяти».


4. Состав материалов для передачи в службу поддержки#

  1. Файл дампа *.hprof. При значительном объёме файл передаётся ссылкой на файловое хранилище, согласованное с ИБ.

  2. Результаты выполнения команд jcmd <PID> VM.flags и jcmd <PID> GC.heap_info.

  3. Журналы сервера приложений /opt/global/globalserver/logs/global3.*.log за период инцидента.

  4. Журналы планировщика /opt/global/globalserver/logs/scheduler/jobscheduler.*.log за тот же период.

  5. Системный журнал: journalctl -u global3 -u globalscheduler --since "<дата>" > journal.log.

  6. Файл параметров запуска /opt/global/globalserver/parameters.sh.