Я читал, что GC (Garbage Collectors) перемещает данные в Heap по соображениям производительности, что я не совсем понимаю, почему, поскольку это оперативная память, возможно, для лучшего последовательного доступа, но мне интересно, обновлены ли ссылки в Stack, перемещение происходит в куче. Но, возможно, адрес смещения остается тем же, но другие части данных могут быть перемещены сборщиками мусора, но я не уверен.Уточняются ли ссылки, когда сборщики мусора перемещают данные в кучу?
Я думаю, что этот вопрос относится к деталям реализации, поскольку не все сборщики мусора могут выполнять такую оптимизацию, или они могут это делать, но не обновлять ссылки (если это обычная практика среди реализаций сборщика мусора). Но я хотел бы получить общий ответ, специфичный для сборщиков мусора CLR (Common Language Runtime).
А также я читал Эрик Липперта «Ссылки не являются адресами» статьи here, и следующий абзац смутил меня немного:
Если вы думаете о ссылке на самом деле являются непрозрачным GC обрабатывать затем становится ясно, что для нахождения адреса, связанного с дескриптором , вам нужно как-то «исправить» объект. Вы должны сообщить GC «до », и этот объект с этим дескриптором не должен перемещаться в памяти , потому что у кого-то может быть указатель на него ». (Там различные способы, чтобы сделать то, что выходит за рамки этого стяжки.)
Это звучит как для ссылочных типов, мы не хотим перемещать данные. Тогда что еще мы храним в куче, которую мы можем перемещать для оптимизации производительности? Может быть, напечатайте информацию, которую мы храним там? Кстати, на случай, если вам интересно, о чем идет речь, Эрик Липперт немного сравнивает ссылки на указатели и пытается объяснить, как может быть неправильно говорить, что ссылки - это просто адреса, даже если это то, как C# реализует его.
А также, если какое-либо из моих предположений неправильно, пожалуйста, исправьте меня.
Если я правильно помню, да. В GC есть «передислоцирующая» фаза, которая перемещает все объекты для удаления/уменьшения фрагментации памяти, и на этом этапе обновляются ссылки на перемещенные объекты. Я попытаюсь найти ссылку из Channel9 (или, возможно, из статьи MSDN), и обновит этот комментарий. Изменить: Вот ссылка: http://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx#what_happens_during_a_garbage_collection (посмотрите на фазу передислокации). – kha
@AdamHouldsworth: Но мой вопрос состоит в том, чтобы узнать, как это происходит: поддерживает ли он опорные значения, обновляя их, когда весь объект перемещается на некоторые другие адреса памяти или просто не перемещает начальный адрес массива объектов так, чтобы он не требует изменения ссылочного значения. – Tarik
@kha: Ваши ссылки были бы высоко оценены! Благодарю. – Tarik