Ответ 1
В CLR используется метод, известный как mark-and-sweep.
Как часть этого метода, каждый объект можно рассматривать как первоначально обозначенный для коллекции. Затем CLR проходит через каждый доступный объект, начиная с ваших глобалов (статические поля и т.д.) В качестве корней, и очищает метку на каждом доступном объекте. Затем он отображает оставшиеся отмеченные объекты.
Имейте в виду, что эта "маркировка" концептуальна; в действительности, объекты, скорее всего, добавлены в набор коллекции.
В случае зацикливания объектов с самопересечением ссылка на объекты не будет найдена в приложении, поэтому алгоритм никогда не достигнет этих объектов, чтобы их "развязать".