Автор оригинала: Ram Lakshmanan.
Безопасная точка Многие из нас знают, что JVM приостанавливает все приложение для сбора мусора. Но есть и другие причины, по которым JVM приостанавливает применение. Для определенных операций виртуальной машины , определенных Операции JVMTI и JIT-действия JVM приостанавливает приложение. Вот несколько таких случаев:
- Выгрузка классов
- Перемещение объектов для исправления дефрагментации памяти
- Деоптимизация Кода
- Очистка кэша кода
- Переопределение класса (например, горячая замена или инструментирование)
- Необъективный отзыв блокировки : :
Для того, чтобы приостановить все потоки приложений, необходимо безопасно остановить. Точка, в которой потоки приложений безопасно останавливаются, называется “Безопасной точкой”. Подходящее название, не так ли?
Вы можете узнать, сколько времени потоки приложений останавливаются в 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”