Ответ 1
Для HotSpot и OpenJDK, по крайней мере, JVM использует безопасные точки для остановки потока приложения в каждом потоке, либо введенного в код JIT, либо путем изменения сопоставлений байт-кода для интерпретируемого кода (см. этот пост от Алексея Рагозина для более подробной информации).
См. также этот ответ от Gil Tene о том, почему safepointing может быть дополнительной проблемой при работе с паузами в паузах.
Вот более подробная информация (как я понимаю, я не претендую на роль эксперта) в механизме safepointing в Hotspot/OpenJDK (см., например, safepoint.cpp, строка 154), основываясь на вышеуказанных ресурсах и, возможно, на некоторых статьях Cliff Нажмите Azul Systems блог (который, кажется, исчез с сайта).
Достижение безопасного места
JVM должен получить контроль над потоком из приложения, поэтому он зависит от текущего состояния потоков:
-
Заблокированные
JVM уже имеет контроль над этим потоком.
-
Выполнение интерпретируемого кода
Интерпретатор переходит в режим (путем замены таблицы отправки), где каждой оценке байт-кода будет предшествовать проверочная проверка.
-
Запуск собственного кода (JNI)
Код JNI запускается в safepoint и может продолжать работать, если он не перезвонит в Java или не вызовет некоторые конкретные методы JVM, после чего он может быть остановлен, чтобы предотвратить выход из safepoint (спасибо Nitsan за комментарии).
-
Запуск скомпилированного кода
JVM делает невозможным чтение определенной страницы памяти (страницы опроса Safepoint), что делает периодические чтения этой страницы (вставленной в скомпилированный код компилятором JIT) сбой и переход к обработчику JVM.
/li > -
Работа в VM или состояниях перехода (также в VM)
В любом случае поток проходит через проверку safepoint, поэтому VM ждет его.
Остановка в safepoint
Как только поток находится в safepoint, управляемом JVM, JVM просто блокирует его от выхода. Когда все потоки остановлены (т.е. Мир остановлен), JVM может выполнить сборку мусора, а затем освободить все потоки, которые возобновляют выполнение.
Для получения более подробной информации вы можете прочитать это сообщение в блоге на сайтах safepoints, написанное Нитсаном Вакаром (тем самым у него еще больше ссылки).