Невозможно дать на это детерминированный ответ, но некоторые могут подумать о поведении.
Прежде всего, все переменные являются локальными переменными. Таким образом, после метод вернулся, эти переменные выходят за рамки. Точное место в памяти (или в регистре CPU), в котором они сейчас проживают, содержит неизвестное содержимое. Другие вещи могут жить в этой области памяти сейчас, мы не знаем. Мы не можем знать. Как таковые, они очищаются? Кто знает.
Однако, для всех целей и задач эти переменные больше не существуют после метод вернулся.
Если вы думаете, что «эти переменные живут в стеке», please note that the stack is an implementation detail.
Теперь дополнительно выделены два объекта кучи, строка и массив.
Поскольку эти ссылки ссылались только на локальные переменные, выходящие за рамки после возврата метода, они больше не считаются живыми и имеют право на сбор.
Однако, что означает «коллекция»? Означает ли это, что сборщик мусора очищает область памяти? Не за что.
Вместо этого, когда мусор собирает память, он фактически делает обратное, это collects living objects. Эти объекты уплотняются в памяти и перемещаются, а область, в которой эта строка и этот массив может быть перезаписана другими объектами. Может быть массив, содержащий только нули, и в этом случае область памяти, скорее всего, будет выглядеть «очищенной», но, вероятно, нет.
Но держитесь, эта строка, с ней что-то особенное. Поскольку строка была написана в исходном коде как литерал, на самом деле это interned при запуске программы. Таким образом, не собрано, это будет еще жить где-то в памяти. Другими словами, эта строка все еще жива и хорошо, где-то в памяти. Может быть, это то же самое место, в котором была упомянутая переменная, может быть где-то в другом месте. Мы не можем знать.
Байты, составляющие объект массива, однако, могут быть перезаписаны сборщиком мусора, когда он уплотняет живые объекты.
OK, поэтому все это бывает после способ возвращен.
Что произойдет, если GC.Collect()
запускает цикл сбора мусора до метод возвращается?
Хорошо, если вы находитесь в сборке RELEASE, все вышеперечисленное остается. Тот факт, что у вас есть локальная переменная в методе, ссылающемся на что-то в куче, ничего не значит, если переменная больше не используется в методе (т. Е. Вы передали последнее использование на временной шкале выполнения).
Однако, если вы используете сборку DEBUG или подключили отладчик, , все области локальных переменных продлены до конца метода. Таким образом, они по-прежнему считаются живыми ссылками и также будут содержать объекты в куче. В этом случае массив не будет собран.
Однако, всякий раз, когда происходит сбор мусора, адрес, где объекты кучи живут в памяти, может измениться, поскольку объекты были уплотнены вместе с другими объектами или переведены в другое поколение.
Здесь приходит фактический ответ на ваш вопрос:
Многое из выше деталей реализации. Мы не должны заботиться о них, потому что это может измениться из-за оптимизации.
Есть много вещей, о которых мы можем рассуждать, но о том, как обрабатывать фактическую базовую память, мы не должны.
Вы сказали в своем комментарии, что считаете, что находитесь в интервью писателя-компилятора, и я бы сказал, что чувство правильное. Если бы вы взяли интервью для группы управления JIT или управления памятью в Microsoft, некоторые знания о том, как это работает, будут, по крайней мере, преподаваться как часть работы, но могут быть бонусом, если вы уже знаете.
Однако для обычного .NET-программиста это необязательно заботиться. Другие умные люди заботятся об этом.
Почему существует запрос «закрыть»? Я просто пытаюсь найти ответы на неизвестные. Любые документы/мысли/ответы/ссылки приветствуются –