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

Почему полный пакет JVM необходим для остановки в мире?

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

4b9b3361

Ответ 1

Во-первых, статья сборника мусора в Википедии действительно хороша.

Говоря о.

В общем случае GC не требует паузы Stop-the-World. Существуют JVM-реализации, которые (почти) паузы свободны (например, Azul Zing JVM). Всякий раз, когда JVM требует, чтобы STW собирал мусор, он зависит от используемого алгоритма.

Mark Sweep Compact (MSC) - популярный алгоритм, используемый по умолчанию в HotSpot. Он выполнен в стиле STW и имеет 3 фазы:

  • MARK - перемещение графика живого объекта для отметки доступных объектов
  • SWEEP - сканирование памяти для поиска немаркированной памяти
  • COMPACT - перенос помеченных объектов для дефрагментации свободной памяти

При перемещении объектов в кучу JVM должен исправить все ссылки на этот объект. Во время процесса перемещения график объекта несовместим, поэтому требуется пауза STW.

Concurrent Mark Sweep (CMS) - это еще один алгоритм в JSM HotSpot, который не использует паузу STW для старой коллекции космического пространства (не совсем такая же, как полная коллекция).

CMS использует барьер записи (триггер действует каждый раз, когда вы пишете ссылку в куче Java) для реализации параллельной версии MARK и не использует COMPACT. Отсутствие уплотнения может привести к фрагментации, и если сбор фонового мусора не будет достаточно быстрым, приложение все равно может быть заблокировано. В этих случаях CMS откажется от коллекции STW mark-sweep-compact.

Существует также G1, который является инкрементным изменением MSC. Вы можете прочитать больше о алгоритмах GC в HotSpot JVM в моем блоге.

Ответ 2

Используя GC пропускной способности, JVM нуждается в паузах STW, чтобы освободить как можно больше памяти. Он использует только такие паузы, что он наиболее эффективен.

Используя сборщик низких пауз (CMS), вы одновременно очищаете старое поколение, не приостанавливая свое приложение. Недостатком является то, что старое поколение становится фрагментированным. Если он слишком фрагментирован и ему требуется уплотнение, происходит полный GC (STW). Тем не менее, вы всегда можете настроить свое приложение, чтобы не получить полный GC.

G1 GC - частный случай. Его текущая основная цель - иметь небольшую фрагментацию в куче, одновременно сохраняя параллельность (например, CMS). Когда он не может достичь этой цели, JVM также возвращается к паузе STW, так что куча полностью очищается и уплотняется.

Ответ 3

stop-the-world гарантирует, что новые объекты не будут выделены, а объекты не станут недоступными во время работы коллектора.

Преимущество состоит в том, что его проще реализовать и быстрее, чем инкрементная сборка мусора.

Ответ 4

Для проверки ссылок на стек в почти любой схеме сбора мусора требуется короткая фаза "остановить-мир", даже в большинстве схем, которые минимизируют паузы. Отличное подробное объяснение в этом ответе. инкрементные и параллельные алгоритмы работают, чтобы свести к минимуму эти паузы до минимума, но в большинстве случаев они все еще имеют.

На самом деле существуют даже методы перемещения/уплотнения, которые не нужно останавливать мир во время перемещения объектов (Staccato приходят на ум)