Что такое "корневая ссылка"?
Цитата из ( Safe in C# not in C++, simple return of pointer / reference, answer 3) Эрика Липперта.
Также обратите внимание, что это не какая-либо ссылка на объект Person, который поддерживает его жизнь. Ссылка должна быть укоренена. Вы можете иметь два объекта личности, которые ссылаются друг на друга, но в остальном недостижимы; тот факт, что у каждого есть ссылка, не поддерживает их жизнь; одна из ссылок должна быть укоренена.
Я не понимаю, может кто-то объясните, что такое корневая ссылка?
2 ответов:
Это означает корень GC.
Прочтите Эту статью, может быть, это поможет вам понять:
Корни GC не являются объектами сами по себе, а являются ссылками на объекты. Любой объект, на который ссылается корневой каталог GC, автоматически переживет следующую сборку мусора. Существует четыре основных вида корня в .NET:
Локальная переменнаяв методе, который в данный момент выполняется , считается корнем GC. Объекты, на которые ссылается к этим переменным всегда можно получить немедленный доступ с помощью метода, в котором они объявлены, и поэтому они должны быть сохранены. Время жизни этих корней может зависеть от способа построения программы. В отладочных построениях локальная переменная сохраняется до тех пор, пока метод находится в стеке. В построениях выпуска JIT может посмотреть на структуру программы, чтобы определить последнюю точку в выполнении, что переменная может использоваться методом, и отбросить ее, когда она больше не требуется. Эта стратегия не всегда используется и может быть отключена, например, при запуске программы в отладчике.
Статические переменные также всегда считаются корнями GC. Объекты, на которые они ссылаются, могут быть доступны в любое время классом, объявившим их (или остальной частью программы, если они являются общедоступными), поэтому .NET всегда будет держать их рядом. Переменные, объявленные как "поток статический", будут существовать только до тех пор, пока этот поток выполняется.
Если управляемый объект передается в неуправляемая библиотека COM+ через interop , то она также станет корнем GC с количеством ссылок. Это происходит потому, что COM+ не выполняет сборку мусора: вместо этого он использует систему подсчета ссылок; как только библиотека COM+ завершает работу с объектом, устанавливая счетчик ссылок равным 0, он перестает быть корнем GC и может быть собран снова.
Еслиобъект имеет финализатор , он не удаляется немедленно, когда сборщик мусора решает, что он больше не "живой". Вместо этого он становится особым видом корня, пока .NET не вызовет метод finalizer. Это означает, что для удаления этих объектов из памяти обычно требуется более одной сборки мусора, так как они выживут в первый раз, когда их обнаружат неиспользуемыми.
(Курсив мой)
Существуют все виды корневых объектов, таких как внутренние объекты CLR, объекты метаданных и т. д. Этот пост может помочь:
Переменные и корни GC
- переменной типа значения-прямое представительство адрес экземпляра типа значения на стеке
- ссылочная переменная на экземпляр типа значения называется управляемым указателем и является указателем на начальный адрес экземпляра типа значения в стеке
- переменная ссылочного типа (UDT, Array, String, Delegate and Interface type variables) - указатель на экземпляр ссылочного типа, созданный в куче GC
Регистры процессора могут содержать управляемые указатели или ссылки на объекты Таблицы широких дескрипторов AppDomain содержат дескрипторы GC, которые являются указателями на закрепленные экземпляры ссылочного типа в памяти. Эти таблицы дескрипторов также содержат управляемые указатели (или ссылки на объекты?) к экземплярам статического типа значений и ссылкам на объекты к экземплярам статического типа ссылок- локальное хранилище потоков (TLS) может содержать ссылки на объекты
- FReachable Queue содержит ссылки на объекты ссылочных типов, на которые не ссылается ни один из указанных выше типов переменных и для которых вызов метода finalize находится в ожидании
Сборщик мусора CLR использует вышеупомянутые переменные, также называемые корнями GC, для отслеживания ссылок на объекты на этапе сборки мусора. Любой экземпляр ссылочного типа, расположенный в куче GC, для которого нет ссылки на объект в любой из перечисленных выше типов переменных (за исключением очереди FReachable) считается кандидатом на сборку мусора и удаляется из кучи GC. Если удаляемый экземпляр ссылочного типа реализует метод Finalize, то ссылка на объект помещается в свободную очередь для вызова метода Finalize отдельным потоком финализатора. Как только поток финализатора завершает вызов метода Finalize для ссылки на объект, соответствующий экземпляр ссылочного типа удаляется из GC куча.
Comments