Что такое «корневая ссылка»? - PullRequest
16 голосов
/ 10 декабря 2011

Цитата из ( Safe в C #, а не в C ++, простой возврат указателя / ссылки, answer 3) Эрика Липперта.

Кроме того, обратите внимание, что это не какая-либо ссылка на объект Person, который поддерживает его. Ссылка должна быть укоренена. Вы можете иметь два объекта Person, которые ссылаются друг на друга, но в противном случае они недоступны; тот факт, что у каждого есть ссылка, не поддерживает их жизнь; одна из ссылок должна быть укоренена.

Не понимаю, может кто-нибудь объяснить, что такое корневая ссылка?

Ответы [ 2 ]

34 голосов
/ 10 декабря 2011

Это означает, что корень GC.

Прочитайте эту статью , возможно, это поможет вам понять:

Корни GC не являются объектамисами по себе, но вместо этого ссылки на объекты.Любой объект, на который ссылается корень GC, автоматически перенесет следующую сборку мусора.В .NET существует четыре основных типа корня:

Локальная переменная в методе, который в данный момент выполняется , считается корнем GC.К объектам, на которые ссылаются эти переменные, всегда можно получить немедленный доступ методом, в котором они объявлены, и поэтому они должны храниться.Время жизни этих корней может зависеть от того, как была построена программа.В отладочных сборках локальная переменная сохраняется до тех пор, пока метод находится в стеке.В выпусках сборки JIT может просматривать структуру программы, чтобы определить последнюю точку в пределах выполнения, которую переменная может использовать в методе, и отбросит ее, когда она больше не требуется.Эта стратегия не всегда используется и может быть отключена, например, путем запуска программы в отладчике.

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

Если управляемый объект передается в неуправляемую библиотеку COM + через interop , он также становитсякорень GC с количеством ссылок.Это связано с тем, что COM + не выполняет сборку мусора: вместо него используется система подсчета ссылок;как только библиотека COM + завершает работу с объектом, устанавливая счетчик ссылок на 0, она перестает быть корнем GC и может быть снова собрана.

Если объект имеет финализатор , он ненемедленно удаляется, когда сборщик мусора решает, что он больше не «живой».Вместо этого он становится особым видом root до тех пор, пока .NET не вызовет метод finalizer.Это означает, что эти объекты обычно требуют удаления более одной сборки мусора из памяти, поскольку они выживут при первом обнаружении, что они не используются.

(выделено мной)

11 голосов
/ 10 декабря 2011

Существуют все виды корневых объектов, таких как внутренние объекты CLR, объекты метаданных и т. Д. Эта запись может помочь :

Переменные и корни GC

  • Переменная типа значения является прямым представлением адреса экземпляра типа значения в стеке
  • Ссылочная переменная для экземпляра типа значения называется управляемым указателем и является указателем на начальный адресэкземпляра типа значения в стеке
  • Переменная ссылочного типа (переменные типа UDT, Array, String, Delegate и Interface) является указателем на экземпляр ссылочного типа, созданный в куче GC
  • Регистры ЦП могут содержать управляемые указатели или ссылки на объекты
  • Широкие таблицы дескрипторов AppDomain содержат дескрипторы GC, которые являются указателями на закрепленные экземпляры ссылочного типа в памяти.Эти таблицы дескрипторов также содержат управляемые указатели (или ссылки на объекты?) На экземпляры статического типа значения и ссылки на объекты на экземпляры статического типа ссылки
  • Локальное хранилище потока (TLS) может содержать ссылки на объекты
  • FReachable Queue содержит объектные ссылки типов ссылок, на которые НЕ ссылаются ни один из перечисленных выше типов переменных и для которых ожидается вызов метода finalize

Сборщик мусора в CLR использует указанные выше переменные, также называемые корнями GC,отслеживать ссылки на объекты на этапе сбора мусора.Любой экземпляр ссылочного типа, расположенный в куче GC, для которого нет ни одной ссылки на объект ни в одном из перечисленных выше типов переменных (кроме очереди FReachable), считается кандидатом на сборку мусора и удаляется из кучи GC.Если удаляемый экземпляр типа ссылки реализует метод Finalize, тогда ссылка на объект помещается в очередь FReachable для вызова метода Finalize отдельным потоком Finalizer.Как только поток Finalizer завершает вызов метода Finalize для ссылки на объект, соответствующий экземпляр типа ссылки удаляется из кучи GC.

...