Подтвердить что ты не робот

Java GC safepoint

Когда сборщик мусора замораживает потоки приложений перед очисткой незарегистрированных объектов, все потоки должны быть в "safepoint" в их исполнении. Я нашел множество писем, описывающих концепцию safepoint, но очень мало примеров. Где будет размещаться safepoint в типичном Java-методе и почему? И что еще более важно, где не может быть safepoint?

4b9b3361

Ответ 1

Точное определение и реализация safepoint изменяется от одной реализации виртуальной машины к другой, но, учитывая Hotspot VM, вы можете найти хорошее определение в: Safepoints в HotSpot JVM.

Глоссарий HotSpot говорит:

Точка во время выполнения программы, при которой известны все корни GC, и содержимое содержимого кучи согласовано. С глобальной точки зрения все потоки должны блокироваться в безопасном месте до запуска GC.

Как правило, safepoint реализуется посредством JVM, вводящего проверку safepoint в метод, большинство сайтов вызовов квалифицируются как safepoints - при достижении проверки safepoint поток проверяет, требуется ли safepoint (например, FullGC запланировано), если да, то поток блокирует. Когда все потоки в блоке VM, вы достигли safepoint, где все объекты в виртуальной машине достижимы. Затем выполняется операция VM, которая запросила безопасное соединение (например, FullGC), после чего потоки возобновляются.

Проверьте список операций VM, требующих safepoint: Безопасность: Safepoints.

Вы можете изучить поведение safepoint в Hotspot с помощью -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1.

Ответ 2

К сожалению, это плохое поле. JVM помещает safepoints, когда он решает, но спецификаций нет. Одна версия/обновление для следующего Java может отличаться. Есть некоторые случаи, такие как Unsafe.copyMemory(), который не имеет safepoint, но вы не можете быть уверены, где будут размещены точки безопасности.