Очень непонятно, что означает ваш вопрос. Можете ли вы тщательно определить, что означает «сбор мусора»? Означает ли это, что «входные данные для алгоритма GC» или «освобождаются путем сжатия кучи GC», или что?
Значения, хранящиеся в стеке - будь то значения типов значений или ссылочных типов - являются корнями алгоритма сбора. Они не собраны , потому что они являются живыми существами, которые поддерживают почти все остальное живым.
И, очевидно, они не освобождаются путем сжатия кучи GC; они освобождаются путем выталкивания стека.
Это отвечает на ваш вопрос?
UPDATE:
Что я имею в виду под "сборкой мусора"
что, если переменная типа значения
найден неиспользованным
приложение, то оно будет удалено
из стека
Хорошо, мы подходим к ответному вопросу, я думаю. Теперь нам нужно понять, что именно вы подразумеваете под «удаленным из стека».
Стек составляет блок предварительно выделенной памяти размером один миллион байтов . Иногда мы используем части этого блока памяти для хранения локальных переменных типа значения. Что именно вы имеете в виду под «изъятым из стека»? Стек никогда не изменяется в размере; это блок предварительно выделенной памяти размером в один миллион байт.
Стек разделен на две смежные области, которые мы назовем «действительными» и «недействительными» разделами стека. На архитектурах x86 регистр ESP указывает на границу между этими регионами. Вы спрашиваете: «При каких условиях память, связанная с конкретной локальной переменной типа значения в стеке, становится частью недопустимого раздела на основе изменения значения регистра ESP в архитектурах x86?»
Это может показаться очень и очень "детальной реализацией" версии вашего вопроса. Стек - это деталь реализации конкретной версии среды выполнения , поэтому, если вы собираетесь задавать вопросы об этом, вам придется принять тот факт, что вы спрашиваете о конкретной значение в конкретном регистре на конкретной архитектуре чипа.
Дальнейшее чтение:
http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx
http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx
http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx
Я немного запутался, когда прочитал то, что вы упомянули о "значениях" и "типах значений". Мне трудно понять разницу.
Это сложно! Мы используем слова «значение» и «ссылка», чтобы означать слишком много вещей. Позвольте мне подвести итог.
Переменная - это место хранения .
Каждая переменная имеет тип . Типом может быть тип значения или тип ссылки .
Место хранения содержит значение .
Значением переменной типа значения является значение типа значения. Например, int является типом значения. Значением переменной типа int является int, скажем, 12.
Значением переменной ссылочного типа является ссылка на объект этого типа или ноль. Например, строка является ссылочным типом. Значением переменной типа string является ссылка на строку или null.
Вот почему они называются «типами значений» и «ссылочными типами». Значение типа значения является экземпляром типа. Значение ссылочного типа является ссылкой на экземпляр типа.
Имеет ли это смысл сейчас?