Как создать дамп потока через JMX? - PullRequest
7 голосов
/ 18 октября 2010

У меня есть Tomcat, работающий в качестве службы Windows, и известно, что он плохо работает с jstack. С другой стороны, jconsole работает хорошо, и я вижу стеки отдельных потоков (я подключаюсь к «localhost: port» для доступа к нему).

Как я могу использовать jconsole или аналогичный инструмент для сброса всех стеков потоков в файл? (аналог jstack)

Ответы [ 4 ]

5 голосов
/ 15 октября 2014

В настоящее время вы можете использовать инструмент jvisualvm для подключения к удаленной JVM через JMX и создания дампа потока. Не знаю, было ли это доступно

Java VisualVM

5 голосов
/ 18 октября 2010

Вы можете использовать ThreadMXBean интерфейс управления.

Этот класс FullThreadDump демонстрирует возможность получения полного дампа потока, а также удаленного обнаружения взаимоблокировки с использованием JMX.

3 голосов
/ 18 октября 2010

Вот еще один пример кода, который запишет дамп стека в файл:

http://pastebin.com/zwcKC0hz

Мы используем это через JMX, чтобы дать нам приблизительноедамп стека, полученный при выполнении запроса JMX или при обнаружении процессом высокой неожиданной нагрузки.

1 голос
/ 22 ноября 2017

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

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

При использовании Java HotSpot 1.8.x:

$ JAVA_HOME / bin / jcmd VM.unlock_commercial_features $JAVA_HOME / bin / jcmd JFR.start длительность = настройки 1800 с = имя файла профиля = / tmp / recording.jfr

IF с использованием java HotSpot 1.7.x:

Отредактируйте свой $ HOME / conf / wrapper.conf файл, добавив следующие параметры при запуске JVM:

wrapper.java.additiona. = - XX: + UnlockCommercialFeatures wrapper.java.additional. = - XX: + FlightRecorder

(заменитьс соответствующим позиционным номером)

Затем перезапустите ваши экземпляры.После этого введите следующую команду:

$ JAVA_HOME / bin / jcmd JFR.start duration = 1800s настройки = имя файла профиля = / tmp / recording.jfr

Запись полета будет производить файлна /tmp/recording.jfr по окончании.

...