[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-kak-poluchit-damp-potoka":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":22,"progress":23,"seo":24},272,"kak-poluchit-damp-potoka",8,"mnogopotochnost","Многопоточность","🔀","Как получить дамп потока?","\u003C!-- grade: 3\u002F5 — описаны способы, но смешаны дамп потока и дамп кучи -->\n\n**Дамп потока (thread dump)** -- это снимок состояния всех потоков JVM в определённый момент времени. Он содержит имена потоков, состояния, стеки вызовов и информацию о блокировках. Дамп потока -- основной инструмент диагностики **deadlock'ов**, **livelock'ов**, **зависаний** и **высокой нагрузки CPU**.\n\n> **Важно:** не путайте **thread dump** (дамп потоков) и **heap dump** (дамп кучи). Thread dump показывает, что делают потоки. Heap dump показывает содержимое памяти (объекты).\n\n### Способы получения thread dump\n\n#### 1. Клавиатурная комбинация \u002F сигнал ОС\n\n| Платформа | Способ |\n|---|---|\n| Windows | \u003Ckbd>Ctrl\u003C\u002Fkbd>+\u003Ckbd>Break\u003C\u002Fkbd> в консоли приложения |\n| Linux \u002F macOS | `kill -3 \u003CPID>` или `kill -QUIT \u003CPID>` |\n\nДамп выводится в `stdout` (или в лог-файл, если stdout перенаправлен).\n\n#### 2. Утилита jstack\n\n```bash\njstack \u003CPID>                    # Обычный дамп\njstack -l \u003CPID>                 # Расширенный (с информацией о блокировках)\njstack -F \u003CPID>                 # Принудительный (если JVM не отвечает)\n```\n\n#### 3. Утилита jcmd (рекомендуемый способ с Java 8+)\n\n```bash\njcmd \u003CPID> Thread.print         # Дамп потоков\njcmd \u003CPID> Thread.print -l      # С информацией о блокировках\n```\n\n#### 4. Программно через ThreadMXBean\n\n\u003Cdetails>\n\u003Csummary>Пример: получение thread dump из кода\u003C\u002Fsummary>\n\n```java\nimport java.lang.management.ManagementFactory;\nimport java.lang.management.ThreadInfo;\nimport java.lang.management.ThreadMXBean;\n\npublic class ThreadDumpUtil {\n    public static String getThreadDump() {\n        ThreadMXBean bean = ManagementFactory.getThreadMXBean();\n        ThreadInfo[] infos = bean.dumpAllThreads(\n            true,  \u002F\u002F lockedMonitors\n            true   \u002F\u002F lockedSynchronizers\n        );\n\n        StringBuilder sb = new StringBuilder();\n        for (ThreadInfo info : infos) {\n            sb.append(info.toString());\n        }\n        return sb.toString();\n    }\n\n    \u002F\u002F Обнаружение deadlock\n    public static long[] detectDeadlocks() {\n        ThreadMXBean bean = ManagementFactory.getThreadMXBean();\n        return bean.findDeadlockedThreads(); \u002F\u002F null если deadlock нет\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n#### 5. Через JConsole \u002F VisualVM \u002F JMC\n\nГрафические инструменты мониторинга JVM позволяют получить thread dump через GUI:\n- **JConsole** -- вкладка «Threads», кнопка «Detect Deadlock»\n- **VisualVM** -- вкладка «Threads», кнопка «Thread Dump»\n- **Java Mission Control (JMC)** -- через Flight Recorder\n\n#### 6. Через IDE\n\nIntelliJ IDEA, Eclipse и другие IDE позволяют получить thread dump запущенного приложения через меню отладки.\n\n### Как читать thread dump\n\n```\n\"main\" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x1a03 waiting on condition [0x00007f...]\n   java.lang.Thread.State: TIMED_WAITING (sleeping)\n        at java.lang.Thread.sleep(Native Method)\n        at com.example.MyApp.main(MyApp.java:15)\n```\n\n| Поле | Значение |\n|---|---|\n| `\"main\"` | Имя потока |\n| `#1` | Номер потока |\n| `prio=5` | Java-приоритет |\n| `tid` | ID потока в JVM |\n| `nid` | Нативный ID потока в ОС |\n| `Thread.State` | Состояние потока (`RUNNABLE`, `WAITING`, `BLOCKED` и т.д.) |\n\n### Способы получения heap dump (дампа кучи)\n\nДля полноты -- способы получения дампа кучи (отдельный инструмент диагностики):\n\n- `jmap -dump:format=b,file=heap.hprof \u003CPID>` -- создание дампа\n- `-XX:+HeapDumpOnOutOfMemoryError` -- автоматический дамп при `OutOfMemoryError`\n- `jcmd \u003CPID> GC.heap_dump filename.hprof` -- через jcmd\n\n> **Аналогия из жизни.** Thread dump -- это фотография всех сотрудников офиса в определённый момент: кто работает, кто ждёт в очереди к принтеру, кто заснул. По этой фотографии можно понять, почему работа не движется (deadlock) или почему один сотрудник постоянно занят (высокая нагрузка CPU).\n\n> **На собеседовании.** Назовите минимум 3 способа: (1) `jstack \u003CPID>`, (2) `kill -3 \u003CPID>` (Linux), (3) `ThreadMXBean` программно. Не путайте thread dump и heap dump -- это разные вещи. Упомяните, что `ThreadMXBean.findDeadlockedThreads()` позволяет программно обнаруживать deadlock'и. В production рекомендуется настроить `-XX:+HeapDumpOnOutOfMemoryError` и иметь скрипт для снятия thread dump.","","middle",[15,16,17,18,19,20,21],"thread dump","jmap","heap dump","JConsole","HPROF","OutOfMemoryError","concurrency",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":35,"featuredSnippetReady":36},"Дамп потока в Java — jmap, JConsole, Ctrl+Break — Gymterview","Интерактивные методы: Ctrl+Break, jmap, gcore, JConsole (HotSpotDiagnostic MBean). По событию: -XX:+HeapDumpOnOutOfMemoryError. Формат HPROF.","Как получить дамп потока — 5 способов","Ctrl+Break, jmap, gcore, JConsole и -XX:+HeapDumpOnOutOfMemoryError. HotSpot генерирует дампы в формате HPROF.",[30,31,32,33,34],"дамп потока Java","heap dump Java","jmap дамп","HeapDumpOnOutOfMemoryError","thread dump JConsole","Интерактивные методы: Ctrl+Break с опцией -XX:+HeapDumpOnCtrlBreak, утилита jmap, команда gcore в ОС, JConsole через MBean HotSpotDiagnostic. По событию: опция -XX:+HeapDumpOnOutOfMemoryError автоматически создаёт дамп при OutOfMemoryError. Формат — HPROF.",true]