Как сборщик решает, какие объекты ещё нужны программе
Программа хранит в памяти не только сами значения, но и объекты — например, запись о пользователе или элемент списка. Чтобы понять, что можно убрать, сборщик мусора обычно не ищет объекты, которыми давно не пользовались. Он проверяет, можно ли до них добраться по ссылкам из того, что программа ещё использует.
Начинает проверку с «корней»: это переменные в активных функциях, глобальные данные и другие ссылки, которые считаются доступными программе. Сборщик прослеживает цепочки от этих корней. Объект, до которого путь нашёлся, сохраняется; остальные можно освободить. Поэтому объект может оставаться в памяти, даже если программа давно к нему не обращалась, — достаточно, чтобы на него всё ещё вела ссылка.
Почему циклические ссылки не мешают очистке
Два объекта могут ссылаться друг на друга, хотя ни один из них уже не связан с активной частью программы. Простая проверка «сколько у объекта ссылок» могла бы принять такую пару за нужную: у каждого есть ссылка от соседа. А обход от корней показывает, что до обоих объектов нельзя добраться, и позволяет убрать их вместе.
Очистка тоже требует ресурсов
Сборщику нужно время, чтобы просканировать память, а перемещение объектов иногда заставляет обновлять ссылки на них. Поэтому языки и среды выполнения по-разному выбирают момент и способ очистки: одни могут ненадолго приостанавливать программу, другие стараются распределять работу по времени. Это обмен удобства на контроль: разработчику не всегда нужно вручную освобождать каждую ячейку, но момент очистки и её цена не всегда предсказуемы.
Важно и то, что сборщик освобождает память, а не закрывает автоматически любой внешний ресурс. Файл или сетевое соединение обычно нужно закрывать явно: освобождённая память не гарантирует, что такой ресурс будет освобождён вовремя.






