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

Общее время, в течение которого были остановлены потоки приложений

Многие из нас знают, что JVM приостанавливает все приложение для сбора мусора. Но есть и другие причины, по которым JVM приостанавливает применение. Для определенных операций виртуальной машины, определенных операций JVMTI и действий JIT JVM приостанавливает приложение. Вот несколько таких случаев;

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

Безопасная точка Многие из нас знают, что JVM приостанавливает все приложение для сбора мусора. Но есть и другие причины, по которым JVM приостанавливает применение. Для определенных операций виртуальной машины , определенных Операции JVMTI и JIT-действия JVM приостанавливает приложение. Вот несколько таких случаев:

  1. Выгрузка классов
  2. Перемещение объектов для исправления дефрагментации памяти
  3. Деоптимизация Кода
  4. Очистка кэша кода
  5. Переопределение класса (например, горячая замена или инструментирование)
  6. Необъективный отзыв блокировки : :

Для того, чтобы приостановить все потоки приложений, необходимо безопасно остановить. Точка, в которой потоки приложений безопасно останавливаются, называется “Безопасной точкой”. Подходящее название, не так ли?

Вы можете узнать, сколько времени потоки приложений останавливаются в Safepoint, передав следующие аргументы в JVM:

-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

Когда вы передадите приведенные выше аргументы, вы увидите следующие выходные данные, которые будут напечатаны в журналах сборки мусора:

16.827: Total time for which application threads were stopped: 0.0010093 seconds, Stopping threads took: 0.0001973 seconds 

Приведенное выше утверждение в основном говорит о том, что через 16,827 секунды с момента запуска приложения потоки приложения были остановлены на 1 миллисекунду (т. е. 0,0010093 секунды), а время, необходимое для остановки потоков, составило: 197,3 микросекунды (т. е. 0,0001973 секунды). Это время паузы приемлемо. Но иногда мы видели случаи, когда потоки приложений останавливались на несколько секунд. Пример:

4279.344: Total time for which application threads were stopped: 12.4744981 seconds, Stopping threads took: 12.3604520 seconds

Здесь вы можете заметить, что потоки приложений были остановлены на 12,47 секунды, а для остановки запущенных потоков потребовалось 12,36 секунды. Это очень большое время паузы. (Примечание: Может быть сложно отслеживать продолжительность безопасной точки, особенно когда вы анализируете тысячи/миллионы инструкций журнала. Именно тогда инструменты анализа журналов сбора мусора, такие как GC легко пригодится. Инструмент GC easy улавливает и сообщает о безопасных точках, которые приостанавливаются на длительное время.)

Теперь мы узнали, как измерить продолжительность безопасной точки. Следующий шаг-изучить причины, которые запускают эти безопасные точки.

-XX:+PrintSafepointStatistics  -XX:PrintSafepointStatisticsCount=1

Когда вы передадите вышеуказанные аргументы JVM своему приложению, причины, вызывающие безопасные точки, будут указаны в журналах GC. Ниже вывод будет напечатан в журналах сбора мусора:

vmop[потоки: всего начально запущенных ожиданий_то_блок] [время: очистка синхронизации спинового блока vmop] page_trap_счет страниц

7044.693: Аннулирование [ 423 2 4 ] [ 11608 0 11611 3 98 ] 2

Теперь давайте попробуем понять это утверждение:

7044.693 – количество секунд с момента запуска JVM произошла эта операция безопасной точки.

RevokeBias – vmop – это операция виртуальной машины, для которой потоки перемещаются в эту безопасную точку.

423 – всего – Общее количество потоков, остановленных в безопасной точке

2 – изначально запуск – Количество потоков, которые способствовали времени “отжима”, описано в разделе ниже

4 – wait_to_block – Количество потоков, которые способствовали времени “блокировки”, описанному в разделе ниже

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

11608 – вращение – время, необходимое для того, чтобы все вращающиеся/выполняющиеся потоки достигли безопасной точки (в миллисекундах)

0 – блок – время, необходимое всем заблокированным потокам для достижения безопасной точки (в миллисекундах)

11611 – синхронизация – общее время, необходимое всем потокам для достижения безопасной точки (в миллисекундах)

3 – очистка – время, затраченное на внутреннюю очистку виртуальной машины (в миллисекундах)

98 – vmop – время, затраченное на саму операцию (в данном случае отзыв).

2 – счетчик страниц_трапа – Количество ловушек страниц

нет работы виртуальной машины Если вы видите, что в поле “voip” должно быть напечатано “нет работы виртуальной машины”, то это называется “гарантированная безопасная точка”. Он запускается самой средой выполнения JVM для обработки всех операций в очереди, которые не являются срочными. Им можно управлять, передавая аргумент JVM “GuaranteedSafepointInterval”:

-XX:GuaranteedSafepointInterval=300000

Эта команда предписывает среде выполнения гарантировать безопасную точку только каждые 300 секунд (т. е. 5 минут).

Оригинал: “https://www.codementor.io/@suryab/total-time-for-which-application-threads-were-stopped-rz4ie0s1r”