Получают ли типы значений сборщик мусора? - PullRequest
18 голосов
/ 26 февраля 2010

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

Ответы [ 3 ]

32 голосов
/ 26 февраля 2010

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

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

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

7 голосов
/ 26 февраля 2010

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

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

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

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

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

1 голос
/ 26 февраля 2010

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

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

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

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