Вопрос с собеседования · Java

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

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

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

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

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

Подробно

Зачем останавливать. Перемещая объект, сборщик должен обновить все ссылки на него. Если поток в этот момент держит адрес в регистре, он обратится к старому месту. В 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 — аварийная остановка JVM при OutOfMemoryError
  • ✗STW бывает только при ручном System.gc()
  • ✗safepoint — точка, где GC сохраняет heap dump, а потоки продолжают работать параллельно
  • ✓STW — пауза потоков приложения в safepoint, чтобы GC безопасно двигал объекты

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования