Что такое stop-the-world и safepoint в работе GC?
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)?
Разбор темы
- GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.