Вопрос

Меня немного смущает тот факт, что в C # мусор собирается только для ссылочных типов.Это означает, что GC выбирает только ссылочные типы для выделения памяти.Итак , что происходит с типами значений , поскольку они также занимают память в стеке?

Это было полезно?

Решение

Для начала, независимо от того, находятся ли они в стеке или часть кучи, зависит от того, в каком контексте они являются частью - если они находятся в пределах эталонного типа, они все равно будут на куче. (Вы должны подумать о том, насколько вы действительно заботитесь о разделении стека/кучи - как написал Эрик Липперт, это в значительной степени деталь реализации.)

Тем не менее, в основном память типа значения восстанавливается, когда контекст восстанавливается, поэтому, когда стек выскочил, вы возвращаетесь из метода, это «восстанавливает» весь кадр стека. Аналогично, если значение типа значения на самом деле является частью объекта, то память восстанавливается, когда этот объект собирается мусор.

Короткий ответ в том, что вам не нужно об этом беспокоиться :) (Это предполагает, что у вас ничего нет Другой Конечно, воспоминания о памяти - если у вас есть структуры со ссылками на нативные ручки, которые необходимо выпустить, это несколько иного сценария.)

Другие советы

Меня немного смущает тот факт, что в C # мусор собирается только для ссылочных типов.

Это не факт.Или, скорее, истинность или ложность этого утверждения зависит от того, что вы подразумеваете под "собрать мусор".Сборщик мусора, безусловно, учитывает типы значений при сборе;эти типы значений могут быть активными и привязаны к ссылочному типу:

struct S { public string str; }
...
S s = default(S); // local variable of value type
s.str = M(); 

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

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

GC выбирает только ссылочные типы для выделения памяти.

Опять же, это не факт.Предположим, у вас есть экземпляр

class C { int x; }

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

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

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

С ними вообще ничего не происходит.С ними ничего не должно случиться.Стек состоит из миллиона байт.Размер стека определяется при запуске потока;он начинается с миллиона байт и остается миллионом байт на протяжении всего выполнения потока.Память в стеке не создается и не уничтожается;изменяется только его содержимое.

В этом вопросе используется слишком много глаголов, таких как разрушенные, восстановленные, сделки, удаленные. Это не соответствует тому, что на самом деле происходит. Локальная переменная просто перестает быть, Норвежский стиль попугая.

Метод имеет одну точку входа, первое, что происходит, заключается в том, что указатель стека процессора регулируется. Создание «кадра стека», место для хранения для локальных переменных. CLR гарантирует, что это пространство инициализируется до 0, а не в противном случае функция, которую вы используете в C# из -за определенного правила назначения.

Метод имеет одну точку выхода, даже если ваш код метода засыпан несколькими return заявления. На этом этапе указатель стека просто восстанавливается до исходного значения. По сути, это «забывает», что локальные переменные, где бы там ни было. Их ценности ни в коем случае не «очищены», байты все еще там. Но они не будут длиться долго, следующий звонок в вашей программе снова перезаписывает их. Правило инициализации CLR гарантирует, что вы никогда не сможете наблюдать за этими старыми ценностями, которые будут неуверенно.

Очень, очень быстро, занимает не более одного цикла процессора. Видимым побочным эффектом такого поведения на языке C# является то, что типы значений не могут иметь финализатора. Обеспечить никакой дополнительной работы.

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

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

Что вы в основном нужно посмотреть на увеличенные претензии, то есть вам нужен способ увеличить набор претензий, которые SharePoint осведомлен для ваших аутентифицированных пользователей. SharePoint позволяет защищать предметы против претензий.

Вы можете сделать претензию увеличения несколькими способами, но два наиболее распространенных являются:

ADFS - Вы уже намекнули на это, но если ADFS используется в качестве пользовательского поставщика идентификатора для вашего приложения, вы можете использовать ADFS PRECT PRETLER и ATTRICE, чтобы запросить базу данных SQL и назначить новые претензии Вашему пользователю. Затем вы просто должны защитить SharePoint, используя эти новые претензии. Если вы следуете на этом маршруте, потом в основном прочитайте все, что Стив Песчка когда-либо опубликовала на эту тему, начиная с этого:

http://blogs.technet.com/b/speschka/archive/2010/07/30/Configurguring-sharepoint-2010-and-adfs-v2-end-do-deend.aspx

Чтобы найти дополнительную информацию об использовании магазина атрибута SQL в ADFS, чтобы претендовать на претензии, посмотрите на это:

http://blogs.technet.com/b/vinitt/archive/2013/04/15/how-to-us-s-to-to-custom-sql- Attribute-Store-to-generate-prects-and-arize-user.aspx

Поставщик претензий - вы можете написать пользовательский поставщик претензий для SharePoint и зарегистрировать его против вашего веб-приложения, вам нужно будет записать весь код, чтобы запросить базу данных и обрабатывать возвращенные значения, но Я предполагаю, что это не проблема. Эта опция фактически дает вам больше контроля над пользовательским опытом в обеспечении SharePoint в качестве ADFS самостоятельно, не позволит интегрировать любые проверки или поисковые аспекты в сборщику претензий (People Picker). Фактически хуже, чем это появится, что любое значение, изученное в сборщике людей, действительно ли он существует как действительное значение атрибута, или нет, это очень открыто для человеческой ошибки при обеспечении элементов SharePoint, чтобы вы могли пожелать рассмотреть гибрид Подход, который использует ADFS для увеличения претензий, но имеет пользовательский поставщик претензий, чтобы позволить вам поискать и разрешать имена из вашей базы данных SQL.

Дополнительная информация и отправная точка для пользовательских поставщиков претензий можно найти здесь:

http://msdn.microsoft. COM / EN-US / Библиотека / GG615945% 28V= Office.14% 29.aspx

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

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

Надеюсь, что помогает.

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

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

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

Каждый экземпляр типа значения в .net будет частью чего -то другого, что может быть более крупным экземпляром типа значения, объектом кучи или кадром стека. Всякий раз, когда какая -либо из этих вещей возникает, любые структуры внутри них также возникнут; Эти структуры будут продолжать существовать до тех пор, пока они содержат их. Когда вещь, которая содержит структуру, перестает существовать, структура также будет. Невозможно уничтожить структуру, не уничтожая контейнер, и нет способа уничтожить что -то, что содержит одну или несколько структур, не разрушая содержащие в них структуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top