Как сборщик мусора идентифицирует осиротевшие объекты? - PullRequest
2 голосов
/ 30 марта 2020

Учитывая состояние памяти, подобное этому:

(1) GC root -> A
(2) GC root -> B
(3) B -> GC root

, где "->" означает "имеет ссылку на". Теперь представьте, что вы удаляете ссылки из GC root в A и B. Я знаю, что A будет собрана, так как она больше недоступна.

А как же B? Он недоступен из GC root, но имеет ссылку на GC root, который все еще жив. B теперь сборщик мусора или нет? Или, другими словами: для обнаружения осиротевших объектов анализ выполняется только в одном направлении, от G C root до других объектов?

1 Ответ

3 голосов
/ 30 марта 2020

Базовая стратегия c, используемая для сбора мусора, заключается в определении того, доступны ли данные в куче из стека. Если это не так, освободите его память.

Вы можете визуализировать это так:

STACK  *** HEAP *** HEAP *** STACK
GC root.  -> A      -> b   -> GC root

Итак, если вы удалите A, у вас все еще будет B, достигающий стека, но сборщик мусора никогда не достигнет B и удалит его (он перемещается только слева направо на право / из стека в кучу). Неважно, что стек может быть достигнут из кучи в вашем примере B -> root G C. Только то, что данные кучи не могут быть получены из стека.

...