Получить доступ

Что такое stop-the-world и safepoint в работе GC?

SeniorJVM и сборка мусора
Коротко

Stop-the-world — пауза, когда все потоки приложения стоят. Останавливаются они в safepoint — точках кода, где JVM точно знает, какие ячейки стека и регистры содержат ссылки, и может безопасно двигать объекты и исправлять ссылки.

  • Safepoint-опросы стоят в переходах цикла и возвратах из методов
  • Пауза = время дойти до safepoint (time-to-safepoint) + сама работа
  • Safepoint нужны не только GC: деоптимизация, снятие дампа, переопределение классов

А ещё Долгий счётный цикл без опросов задерживает остановку всех потоков

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Зачем останавливать. Перемещая объект, сборщик должен обновить все ссылки на него. Если поток в этот момент держит адрес в регистре, он обратится к старому месту. В safepoint JVM располагает картой ссылок (oop map) для каждого кадра и может всё исправить.

Как поток доходит до safepoint. JIT вставляет опрос (чтение страницы памяти или флага) в обратные переходы циклов и при возврате из методов. JVM включает флаг — потоки доходят до ближайшего опроса и останавливаются. Поток в нативном коде или заблокированный считается уже в safepoint.

Time-to-safepoint. Пауза начинается, когда остановлен первый поток, а работа — когда последний. Счётный цикл по int, который JIT счёл «коротким», может не иметь опросов — и вся JVM ждёт его. В логах это видно как разница между временем до остановки и временем пауз (-Xlog:safepoint).

Эволюция сборщиков — перенос работы из паузы в конкурентные фазы: Parallel делает всё в паузе, G1 — маркировку конкурентно, ZGC и Shenandoah — и перемещение. Современные JVM также останавливают потоки по одному (thread-local handshakes) там, где не нужна глобальная пауза.

Что хотят услышать

  • Зачем нужна остановка.
  • Что такое safepoint и где он стоит.
  • Time-to-safepoint как скрытая часть паузы.

Частые ошибки

  • Путать STW с крахом JVM.
  • Считать, что вся работа GC всегда останавливает приложение.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓STW — пауза, когда потоки приложения замирают в safepoint (точке с согласованным состоянием стека), чтобы GC мог безопасно двигать объекты и менять ссылки
  • ✗STW — аварийная остановка JVM при OutOfMemoryError
  • ✗safepoint — это точка сохранения heap dump на диск
  • ✗STW бывает только при ручном System.gc()

Что спросят дальше

  • Зачем нужна конкурентная маркировка?
  • Что такое барьер записи (write barrier)?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем