Эксплуатация JVM

Создание снимка стеков потоков

Для диагностики работы Java-приложения одним из самых полезных источников информации являются снимки стеков потоков (дамп потоков, thread dump). Каждый такой снимок включает в себя список всех потоков Java, запущенных в данный момент в JVM. Для каждого потока содержится информация о его состоянии (state), трассировка потоков (stack trace) — имена классов и строк, которые выполнялись в момент формирования снимка.

Более подробно ознакомиться с информацией, содержащейся в снимке стеков потоков, вы можете в документации класса Thread (ссылка на документацию).

В информационных системах на основе SMP Java-приложениями являются само приложение SMP и брокер очередей Artemis.

Выполнять команды следует от имени пользователя, под которым запущено приложение. Если установка выполнена согласно данному руководству, то это пользователь nausd4.

Получить снимок можно следующим способом. Снимок будет сохранен в каталог /opt/naumen/mon/<текущая дата>.

  • Создайте каталог для сбора диагностической информации.

    mkdir -p /opt/naumen/mon/$(date +'%F') && cd $_

  • Сформируйте снимок стеков потоков.

    SMP:

    /opt/naumen/java/bin/jstack $(pgrep -f java.*tomcat) > ./stack_$(date +'%F-%H-%M-%S').txt

    Artemis:

    /opt/naumen/java/bin/jstack $(pgrep -f java.*artemis) > ./stack_$(date +'%F-%H-%M-%S').txt

Периодическое создание снимков стеков потоков для сервисов Java

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

  • Создайте каталоги для сохранения рабочих файлов.

    mkdir -p /opt/naumen/deploy/$(date +'%F')/{update,backup}

  • Создайте каталог для сохранения диагностической информации. Владельцем каталога должен быть пользователь от имени которого работает процесс java.

    mkdir -p /opt/naumen/mon/

  • Скачайте с сайта NAUMEN (ссылка для скачивания) файлы и поместите их в созданный каталог update.

    • jstack.sh — скрипт снятия снимков стеков потоков;
    • jstack.service — файл описания systemd-юнита;
    • jstack.timer — файл описания systemd-таймера.
  • Отредактируйте скрипт jstack.sh, указав в нем путь размещения приложения, количество дней хранения снимков стеков потоков.
  • Отредактируйте jstack.timer, указав в параметре OnCalendar периодичность снятия снимков стеков потоков (ссылка на описание systemd.time).

    Настроенная в шаблоне периодичность снятия снимков составляет 1 минуту и соответствует нашим рекомендациям.

  • Поместите скрипт jstack.sh в /opt/naumen/mon/ и сделайте его исполняемым.

    • Скопируйте скрипт.

      cp /opt/naumen/deploy/$(date +'%F')/update/jstack.sh /opt/naumen/mon/

    • Сделайте его исполняемым.

      chmod +x /opt/naumen/mon/jstack.sh

  • Поместите файлы jstack.service и jstack.timer в /etc/systemd/system и включите таймер.

    • Скопируйте файл сервиса jstack.

      sudo cp /opt/naumen/deploy/$(date +'%F')/update/jstack.service /etc/systemd/system/

    • Скопируйте файл таймера jstack.

      sudo cp /opt/naumen/deploy/$(date +'%F')/update/jstack.timer /etc/systemd/system/

    • Перечитайте файлы.

      systemd sudo systemctl daemon-reload

    • Включите автозапуск таймера при загрузке сервера.

      sudo systemctl enable jstack.timer

    • Включите таймер.

      sudo systemctl start jstack.timer

Создание дампа памяти

Дамп памяти (Heap dump) — это слепок текущего состояния памяти Java-приложения, со всеми данными, обращающимися в нем в данный момент времени.

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

В информационных системах на основе SMP Java-приложениями являются само приложение SMP и брокер очередей Artemis.

Размер дампа памяти равен объему памяти, выделенной приложению. При получении дампа памяти необходимо учитывать свободное место на диске.
В зависимости от объема выделенной приложению памяти, производительности дисковой подсистемы, загруженности сервера создание дампа памяти может занимать продолжительное время (несколько минут). В это время приложение будет недоступно.
Выполнять команды следует от имени пользователя, под которым запущено приложение. Если установка выполнена согласно данному руководству, то это пользователь nausd4.

Получить дамп памяти можно следующим способом. Дамп будет сохранен в каталог /opt/naumen/mon/<текущая дата>.

  • Создайте каталог для сбора диагностической информации.

    mkdir -p /opt/naumen/mon/$(date +'%F') && cd $_

  • Создайте дамп памяти.

    /opt/naumen/java/bin/jmap -dump:file=./dump_$(date +'%F-%H-%M-%S').hprof $(pgrep -f tomcat)

Изменение параметров JVM

Параметры JVM изменяются в файле /opt/naumen/nausd4/tomcat/bin/setenv.sh.

Перед изменением необходимо сделать резервную копию настроек. Подробнее см. в разделе Создание резервной копии SMP.

Изменения вступают в силу при перезапуске приложения.

Подробнее о параметрах JVM см. в разделе Конфигурация производительности Java-машины.