## k8sThreadAndHeapDump

**Дамп** — это данные, полученные с носителя информации и сохраненные где-либо для дальнейшего анализа . Виртуальная машина Java (JVM) помогает управлять памятью в Java, и в случае ошибок мы можем получить файл дампа из JVM для диагностики ошибок.


| Параметр | Heap Dump (Дамп кучи) | Thread Dump (Дамп [потоков](/2%20ComputerScience/2.0%20Linux/2.0.4%20ConcurrencyAndMultitasking/2.0.4.2%20Thread.md)) |
|----------|-----------|-------------|
| **Формат** | Бинарный (`.hprof`, `.phd`, `.heap`). Человек его не прочитает. | Текстовый (логи, консоль). Человек может прочитать и понять. |
| **Инструменты** | Специальные анализаторы: Eclipse MAT, VisualVM, YourKit, JProfiler. | Любой текстовый редактор, но удобнее — jstack, fastThread, JVisualVM. |
| **Когда делать** | На пике использования памяти или перед OutOfMemoryError. | В момент зависания / долгой операции (обычно делают несколько дампов с интервалом). |

### Heap Dump

Во время выполнения JVM создает кучу, которая содержит ссылки на объекты, используемые в работающем Java-приложении. Дамп кучи содержит слепок текущего состояния всех объектов, используемых во время выполнения.

Heap Dump используется тогда:
* Когда приложение аварийно завершает работу из-за `OutOfMemoryError` в Java (Out of Memory (OOM) Killer);
* Когда вы подозреваете утечку памяти;
* В ходе стресс-теста для оценки способности объекта удерживаться в памяти.

Heap Dump может быть в двух форматах – классическом и в формате Portable Heap Format (PHD).

### Thread Dump

Thread Dump содержит снимок состояния всех [потоков](/2%20ComputerScience/2.0%20Linux/2.0.4%20ConcurrencyAndMultitasking/2.0.4.2%20Thread.md) в запущенной программе Java в определенный момент времени. 

Thread Dump используется для:
* Диагностировании проблем с эффективностью в Java-приложениях (н/р: [cpu](/4%20Linkage/4.3%20Docker/4.3.6%20Orchestrators/4.3.6.6%20Resources/4.3.6.6.1%20k8sCPU.md) > 100%);
* Выявить ситуации, когда потокам не хватает процессорного времени;
* Помочь обнаружить потоки, застрявшие в бесконечном цикле.

### Снятие дампов

Задача: Снять jfr/dump через kubectl cli команду терминала

<details><summary>Снять heap dump</summary>
<p>

```
1) логинимся  

kubectl login https://...:443 --username 412@company.ru

2) выбираем нужный неймспейс

kubectl config set-context --current --namespace <NAME>

3) подключиться к терминалу POD

kubectl exec -it <SERVICE_NAME>-<ID_POD> -- /bin/bash

4) номер PID процесса: узнать его можно через команду jcm

jcmd

5) снимаем heap_dump (после jcmd идет номер PID процесса)

jcmd <PID> GC.heap_dump /tmp/heapdump.hprof

6) выходит из терминала ПОДы 

exit

7.1) сохраняем в папку на BPM (где находится kubectl)

kubectl cp <SERVICE_NAME>-<ID_POD>:/tmp/heapdump.hprof ./<SERVICE_NAME>-<ID_POD>.hprof
* /tmp/heapdump.hprof - каталог куда сформировали файлы дампа
* ./<SERVICE_NAME>-<ID_POD>.hprof - локальный каталог и имя файла

7.2) удалить дампы с пода

rm /tmp/heapdump.hprof

-- Снимаем JFR (опционально)
8) запустить запись JFR (после jcmd идет номер PID процесса, узнать его можно набрав команду jcmd)

jcmd <PID> JFR.start filename=/tmp/<SERVICE_NAME>-<ID_POD>.jfr duration=5m maxsize=250m

9) проверка состояния записи

jcmd <PID> JFR.check

10) выходим из терминала поды после 5 минут

exit

11.1) сохраняем в папку на BPM (где находится kubectl)

kubectl cp <SERVICE_NAME>-<ID_POD>:/tmp/<SERVICE_NAME>-<ID_POD>.jfr ./<SERVICE_NAME>-<ID_POD>.jfr

11.2) удалить дампы с пода
rm /tmp/<SERVICE_NAME>-<ID_POD>.jfr
```

</p>
</details>

<details><summary>Снять thread dump</summary>
<p>

// Современный, надежнее способ
jcmd <PID> Thread.print /tmp/thread.txt 

// Классический способ до jcmd
jstack -e <PID> > /tmp/threaddump.txt

</p>
</details>

### Анализ dump`ов

В jdk есть штатная утилита jhat, которая позволяет читать heap-dump

В частности в jdk1.8.0, которая ранее можно было найти в distr на общей шаре, данная утилита присутствует. 

Для чтения heap.dump выполняем команду из каталога, где расположениа утилита:

`./jhat.exe "C:\ПутьДоХипДампа\heap.dump"`

![jhatAnalyzeDump](https://github.com/eldaroid/pictures/blob/master/iOSWiki/Common/Orchestration/jhatAnalyzeDump.png?raw=true)

В результате команды запустится веб-сервер по умолчанию на 7000 порту(параметр -p).

Прочитать содержимое файла можно перейдя по адресу localhost:7000.

### Анализ jfr файлов

Открыть полученный файл jfr в инструменте для анализа JFR, таком как Java Mission Control (JMC) или любом другом инструменте, который поддерживает формат JFR.

В JMC можно исследовать вкладки "Flame Graph", "Method Profilling", "Allocations" и др., чтобы проанализировать производительность приложения.

----------

[4.3.6.6.2 k8s Memory Theme](./4.3.6.6.2%20k8sMemory.md) | [Back To iOSWiki Contents](https://github.com/eldaroid/iOSWiki) | [4.3.6.6.4 Horizontal Pod Autoscaler Theme](./4.3.6.6.4%20HorizontalPodAAutoscaler.md)