Как GC помечает недоступный объект, поскольку он уже недоступен - PullRequest
0 голосов
/ 05 октября 2019

Я считаю, что это простой вопрос, но у меня есть небольшое сомнение в моем понимании. Меня беспокоит всякий раз, когда GC запускает сбор мусора, в основном это три шага:

  1. Mark
  2. Sweep
  3. Compacting

Во время маркировкифаза GC, проходит от корня GC ко всем объектам и делает маркировку недоступных объектов. который я прочитал во многих блоках.

Здесь я сомневаюсь, что при обходе от корня GC GC будет посещать только живой объект (на который ссылается дерево). Правильно! Тогда определенно не было бы способа добраться до недостижимого объекта. Так как GC будет маркировать недоступные объекты, так как GC не может добраться до них. Пожалуйста, помогите мне понять эту концепцию. Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 октября 2019

Как GC помечает недоступный объект, поскольку он уже недоступен

Недоступные объекты не помечены.

Идея состоит в том, что процесс маркировкипосещает все доступные объекты и ставит отметку на каждом найденном объекте. Затем фаза очистки избавляется от объектов, которые НЕ помечены.

Так как же GC находит объекты, которые не были помечены?

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

Это то, что делает уборщик. Он просматривает все объекты, проверяя, отмечены ли они или нет. Объекты, которые не отмечены, затем удаляются.

(я много упрощаю ...)

0 голосов
/ 06 октября 2019

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

0 голосов
/ 06 октября 2019
  • Mark - отметка живой объект, начинающийся с корней GC
  • Sweep - обход кучи для идентификации неотмеченных объектов
  • Compact - перемещение объектов в куче всделать свободную память непрерывной (мера счетчика фрагментации)
...