Подтвердить что ты не робот

Получают ли значения типы сбора мусора?

Я знаю, что ссылочным типом будет сбор мусора. Я хотел знать, будут ли типы значений также собирать мусор из стека?

4b9b3361

Ответ 1

Очень непонятно, что означает ваш вопрос. Можете ли вы точно определить, что означает "сбор мусора"? Означает ли это, что "являются входами в алгоритм 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.

Значение переменной ссылочного типа является ссылкой на объект этого типа или null. Например, строка является ссылочным типом. Значение переменной типа string является ссылкой на строку или null.

Вот почему они называются "типами значений" и "ссылочными типами". Значение типа значения является экземпляром типа. Значение ссылочного типа является ссылкой на экземпляр типа.

Это имеет смысл сейчас?

Ответ 2

Общая среда выполнения (CLR) общего языка выделяет память для объектов в двух местах: стек и кучу.

Типы значений хранятся в стеке вместе со ссылками на содержимое ссылочного типа, хранящиеся в куче. Точкой сборщика мусора является освобождение памяти, назначенной для содержимого ссылочного типа в куче, когда ссылка выставляется из стека.

Тип значения, который не является содержимым ссылочного типа, не сохраняется в куче, поэтому он не очищается сборщиком мусора.

См. здесь несколько более подробное описание значений по сравнению с ссылочными типами

См. здесь более подробное описание

Ответ 3

Предполагая, что вы имеете в виду "сбор мусора" в том смысле, что сборщик мусора проверяет, живы ли они, а затем восстанавливает память, тогда ответ не является "сбор мусором".

Причина в том, что память в стеке автоматически восстанавливается по мере удаления кадров стека.

Прочитайте эту статью: http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks