Ссылка на объект в управляемой среде очень отличается от переданной ссылки в C ++. Чтобы понять, что делает их особенными, представьте, как будет обрабатываться следующий сценарий на уровне компьютера без ссылок на объекты, собираемые мусором: метод «Foo» возвращает строку, которая хранится в разных коллекциях и передается в разные части кода. Если строка больше не нужна, должна быть возможность восстановить всю память, использованную для ее хранения, но неясно, какой фрагмент кода будет последним, который будет использовать строку.
В системе без GC каждая коллекция либо должна иметь свою собственную копию строки, либо должна содержать что-то, содержащее указатель на общий объект, который содержит символы в строке. В последнем случае разделяемый объект должен каким-то образом знать, когда будет удален последний указатель на него. Существует множество способов, которыми это может быть обработано, но существенным общим аспектом всех них является то, что общие объекты должны быть уведомлены, когда указатели на них копируются или уничтожаются. Такое уведомление требует работы.
В отличие от этого, в системе GC программы снабжаются метаданными, указывающими, какие регистры или части стекового фрейма будут использоваться в любой момент времени для хранения корневых ссылок на объекты. Когда происходит цикл сбора мусора, сборщик мусора должен будет проанализировать эти данные, идентифицировать и сохранить все живые объекты и уничтожить все остальное. Однако в любое другое время процессор может копировать, заменять, перемешивать или уничтожать ссылки в любом шаблоне или последовательности, которые ему нравятся, без необходимости уведомлять какие-либо из задействованных объектов. Обратите внимание, что при использовании уведомлений об использовании указателя в многопроцессорной системе, если разные потоки могут копировать или уничтожать ссылки на один и тот же объект, потребуется код синхронизации, чтобы сделать необходимое уведомление безопасным для потока. Напротив, в системе GC каждый процессор может изменять опорные переменные в любое время без необходимости синхронизировать свои действия с любым другим процессором.