Как создать дамп потока через JMX?

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

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


person ripper234    schedule 18.10.2010    source источник


Ответы (4)


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

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

person dogbane    schedule 18.10.2010

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

Java VisualVM

person Claudio    schedule 15.10.2014
comment
Это невероятно медленно :( - person Vladimir Filipchenko; 27.11.2015

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

http://pastebin.com/zwcKC0hz

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

person Gray    schedule 18.10.2010

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

Обычно хватает получасовой записи. Чтобы запустить запись, вы должны войти в систему на машинах и ввести следующую команду:

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

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

ЕСЛИ используется Java HotSpot 1.7.x:

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

wrapper.java.additiona.=-XX:+Разблокировать коммерческие функции wrapper.java.additional.=-XX:+FlightRecorder

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

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

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

После завершения записи полета будет создан файл в /tmp/recording.jfr.

person Sanjeet Pandey    schedule 22.11.2017