Типы значения добираются, Собрал "мусор"?

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

19
задан John Rasch 26 February 2010 в 15:53
поделиться

3 ответа

Очень неясно, что означает ваш вопрос. Можете ли вы тщательно определить, что означает "сборка мусора"? Означает ли это "являются входными данными для алгоритма GC", или "деаллокируются путем уплотнения кучи GC", или что?

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

И очевидно, что они не деаллоцируются при уплотнении кучи GC; они деаллоцируются при выгрузке стека.

Это отвечает на ваш вопрос?

UPDATE:

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

Хорошо, мы приближаемся к ответу на вопрос, я думаю. Теперь нам нужно понять, что именно вы имеете в виду под "удаляется из стека".

Стек - это блок предварительно выделенной памяти размером в миллион байт. Иногда мы используем часть этого блока памяти для хранения локальных переменных типа value. Что именно вы имеете в виду под "удалением из стека"? Стек никогда не изменяется в размере; это блок предварительно выделенной памяти размером в один миллион байт.

Стек разделен на две смежные области, которые мы будем называть "действительной" и "недействительной" секциями стека. На архитектурах x86 регистр ESP указывает на границу между этими областями. Вы спрашиваете: "При каких условиях память, связанная с определенной локальной переменной типа value на стеке, становится частью недействительной секции на основе изменения значения регистра 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

Я немного запутался, читая то, что вы упомянули о "значениях" и "типах значений". Мне трудно понять разницу.

Это сложно! Мы используем слова "значение" и "ссылка" для обозначения слишком многих вещей. Позвольте мне подвести итог.

Переменная - это место хранения.

Каждая переменная имеет тип. Тип может быть типом значения или ссылочным типом.

Место хранения содержит значение.

Значение переменной типа value - это значение типа value. Например, int - это тип значения. Значением переменной типа int является число int, скажем, 12.

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

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

Теперь понятно?

34
ответ дан 30 November 2019 в 03:02
поделиться

Среда CLR выделяет память для объектов в двух местах: стеке и куче.

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

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

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

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

8
ответ дан 30 November 2019 в 03:02
поделиться

Предположим, вы имеете в виду «сборщик мусора» в смысле проверки сборщиком мусора, живы ли они, а затем освобождения памяти, тогда ответ - нет «собранный мусор».

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

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

2
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: