Как распределяется память для глобальных переменных в .NET? - PullRequest
1 голос
/ 24 января 2012

Распределение памяти в программе: код и данные.Стек.Куча.

Если у меня есть статическая / глобальная переменная (скажем, примитивного типа), то теория предполагает, что память выделяется при загрузке скомпилированной программы (игнорируя динамическое связывание и загрузку в этом примере и предполагая, что программасостоит из одного модуля).

Но что, если глобальная переменная является ссылочным типом?Настраивает ли среда выполнения распределение памяти области кода / данных?Или ссылка просто существует в области кода / данных и указывает на область памяти в куче?

Ответы [ 2 ]

5 голосов
/ 24 января 2012

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

Эта куча отделена от обычной кучи, собираемой мусором - она ​​называется "кучей высокой частоты", и существует одна для каждой области приложения.

Проверьте этот пост Демистифицирована статическая переменная

2 голосов
/ 24 января 2012

Статические переменные выделяются из кучи загрузчика AppDomain компилятором JIT, когда он преобразует IL в машинный код.Он напрямую компилирует адрес в код, очень эффективно.Он остается там до тех пор, пока куча не будет уничтожена при выгрузке AppDomain.Это не куча GC, адрес переменной никогда не меняется.

Если это переменная ссылочного типа, то некоторый код, который вы написали, будет запущен позже для инициализации переменной.Который хранит адрес куска памяти из кучи собранного мусора в переменную.Затем он обрабатывается сборщиком мусора точно так же, как любая другая ссылка, обновляя значение при сжатии кучи.И, конечно, очень высока вероятность того, что указанный объект окажется в поколении 2, если вы явно не назначите нуль переменной.

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