Рубрики
Без рубрики

Захват свалки java-потока

Узнайте, как захватить дамп java-потока

Автор оригинала: baeldung.

Захват свалки java-потока

1. Обзор

В этом учебнике мы обсудим различные способы захвата свалки потоков java-приложения.

Дампа потока является моментальным снимком состояния всех потоков процесса Java, . Состояние каждого потока представлено следом стека, показывающим содержимое стека потока. Дампа потока полезна для диагностики проблем при отображении активности потока. Свалки потоков написаны простым текстом, поэтому мы можем сохранить их содержимое в файле и посмотреть на них позже в текстовом редакторе .

В следующих разделах мы пройдемся по нескольким инструментам и подходам для создания свалки потоков.

2. Использование утилит JDK

JDK предоставляет несколько утилит, которые могут захватить свалку потока java-приложения. Все коммунальные услуги расположены под бен папка внутри домашнего каталога JDK . Таким образом, мы можем выполнять эти утилиты из командной строки до тех пор, пока этот каталог находится на нашем системного пути.

2.1. jstack

jstack — это командная линия УТИЛИТА JDK, которую мы можем использовать для захвата свалки потоков. Он принимает пид процесса и отображает дампа потока в консоли. Кроме того, мы можем перенаправить его выход в файл.

Давайте рассмотрим основной синтаксис команды для захвата свалки потоков с помощью jstack:

jstack [-F] [-l] [-m] 

Все флаги не являются обязательными. Давайте посмотрим, что они означают:

  • -F опция заставляет дампа потока; удобно использовать при jstack pid не отвечает (процесс завис)
  • -l опция поручает утилите искать собственные синхронизаторы в куче и замки
  • -m вариант печатает кадры из родных стеков (C и C) в дополнение к рамкам стеков Java

Давайте будем использовать эти знания, захватив дампа потока и перенаправив результат в файл:

jstack 17264 > /tmp/threaddump.txt

Помните, что мы можем легко получить пид Java-процесса с помощью JPS команда.

2.2. Управление полетами Java

Java Управление полетами (JMC) — это инструмент gui, который собирает и анализирует данные из Java-приложений. После запуска JMC отображается список java-процессов, работающих на локальной машине. Мы также можем подключиться к удаленным Java-процессам через JMC.

Мы можем нажать правой кнопкой мыши на процесс и нажать на ” Начало записи полета ” вариант. После этого Темы вкладка показывает потоковые свалки:

2.3. jvisualvm

jvisualvm это инструмент с графическим пользовательским интерфейсом, который позволяет нам отслеживать, устранения неполадок и профиля Java приложений . Графический интерфейс прост, но очень интуитивно понятен и прост в использовании.

Один из его многочисленных вариантов позволяет нам захватить свалку потока. Если мы нажимаем правой кнопкой мыши на процесс Java и выбираем “Thread Dump” опция, инструмент создаст дампа потока и откроет его в новой вкладке:

По данный раз JDK 9 Visual VM не входит в дистрибутивы Oracle JDK и Open JDK. Поэтому, если мы используем Java 9 или более новые версии, мы можем получить JVisualVM от Visual VM с открытым исходным кодом сайт проекта .

2.4. jcmd

jcmd это инструмент, который работает, отправляя командные запросы в JVM. Хотя мощный, он не содержит удаленной функциональности – мы должны использовать его в той же машине, где работает процесс Java.

Одна из его многочисленных команд Thread.print . Мы можем использовать его, чтобы получить свалку потока, просто указав пид процесса:

jcmd 17264 Thread.print

2.5. jconsole

jconsole позволяет нам проверить стек след каждого потока. Если мы откроем jconsole и подключиться к запущенной Java-процессу, мы можем перейти к Темы вкладка и найти след стека каждого потока :

2.6. Резюме

Как оказалось, существует множество способов захвата свалки потоков с помощью утилит JDK. Давайте на минутку поразмыслим над каждым из них и наметим их плюсы и минусы:

  • jstack : обеспечивает самый быстрый и простой способ захвата свалки потоков. Тем не менее, лучшие альтернативы доступны, начиная с Java 8
  • jmc : расширенный инструмент профилирования и диагностики JDK. Это сводит к минимуму накладные расходы на производительность, что, как правило, проблема с инструментами профилирования
  • jvisualvm : легкий инструмент профилирования с открытым исходным кодом с отличной консолью GUI
  • jcmd : чрезвычайно мощный и рекомендуется для Java 8 и позже. Единый инструмент, который служит многим целям – захват потока дампа ( jstack ), куча свалки ( jmap ), свойства системы и командно-линейные аргументы ( jinfo )
  • jconsole : Давайте проинспектируем информацию о стеке потоков

3. От командной линии

На серверах корпоративных приложений по соображениям безопасности устанавливается только JRE. Таким образом, мы не можем использовать вышеупомянутые утилиты, поскольку они являются частью JDK. Тем не менее, существуют различные командно-линейные альтернативы, которые позволяют нам легко захватывать свалки потоков.

3.1. убить -3 Командование (Linux/Unix)

Самый простой способ захвата свалки потоков в системах, похожих на Unix, — это убить команды, которую мы можем использовать для отправки сигнала в процесс с помощью убить () системный вызов. В этом случае мы отправим его в -3 сигнал.

Используя нашу ту же пид из более ранних примеров, давайте посмотрим, как использовать убить для захвата свалки потоков:

kill -3 17264

Таким образом, процесс получения сигнала Java будет печатать дампа потока на стандартном выходе.

Если мы забудем процесс Java со следующей комбинацией флагов настройки, то он также перенаправит дампа потока в данный файл:

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=~/jvm.log

Теперь, если мы отправим -3 сигнал, в дополнение к стандартному выходу, дамп будет доступен в В/jvm.log файл.

3.2. Ctrl и перерыв (Windows)

В операционных системах Windows мы можем захватить свалку потоков с помощью CTRL и Перерыв ключевая комбинация . Чтобы сделать дампа потока, перейдите на консоль, используемую для запуска java-приложения, и нажмите на CTRL и Перерыв ключи вместе.

Стоит отметить, что на некоторых клавиатурах Перерыв ключ недоступен. Поэтому в таких случаях свалка потока может быть захвачена с помощью CTRL , SHIFT , и Пауза ключи вместе.

Обе эти команды печатают дампа потока на консоль.

4. Программное использование ThreadMxBean

Последний подход, который мы обсудим в статье, это использование JMX . Мы будем использовать ThreadMxBean для захвата свалки потока . Давайте посмотрим его в коде:

private static String threadDump(boolean lockedMonitors, boolean lockedSynchronizers) {
    StringBuffer threadDump = new StringBuffer(System.lineSeparator());
    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    for(ThreadInfo threadInfo : threadMXBean.dumpAllThreads(lockedMonitors, lockedSynchronizers)) {
        threadDump.append(threadInfo.toString());
    }
    return threadDump.toString();
}

В вышеупомянутой программе мы делаем несколько этапов:

  1. Сначала пустая СтрингБуффер инициализируется для хе- итука информации о стеке каждого потока.
  2. Затем мы используем УправлениеФактория класс, чтобы получить экземпляр ThreadMxBean. УправлениеФактория это заводской класс для получения управляемых бобов для платформы Java. Кроме того, ThreadMxBean является интерфейсом управления для системы потоков JVM.
  3. Установка заблокированМониторы и заблокировансинхронизаторы ценности для истинное указывает на захват собственных синхронизаторов и всех заблокированных мониторов в дампах потоков.

5. Заключение

В этой статье мы показали несколько способов захвата свалки потоков.

Сначала мы обсуждали различные утилиты JDK, а затем альтернативы командной линии. В последнем разделе мы завершили с программным подходом с использованием JMX.

Как всегда, полный исходный код примера доступен более на GitHub .