# Снятие дампа памяти 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. Определить идентификатор процесса

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

```bash
sudo systemctl show -p MainPID --value global3
```

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

```bash
sudo systemctl show -p MainPID --value globalscheduler
```

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

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

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

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

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

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

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

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

```bash
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`.
