Какой механизм JVM используется для блокировки потоков во время паузы в мире

Я слышал этот вопрос на собеседовании и не мог дать ответ. Позже я обыскал через Интернет и до сих пор не нашел ответа. Может ли кто-нибудь сказать мне, как JVM останавливает потоки во время паузы в паузе, когда собирает мусор и как он запускает их снова.

Ответы

Ответ 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, написанное Нитсаном Вакаром (тем самым у него еще больше ссылки).