CLR: каково время жизни константных строковых значений в памяти? - PullRequest
4 голосов
/ 21 июля 2010

Скажем, у нас есть класс с 10000 членами строки const.

class Schema
{
  //Average string length is 20
  public const string ID1 = "some.constant.value";
  public const string ID2 = "some.other.constant.value";
  //...
}

Не все поля упоминаются в остальной части кода. Только 10% из них доступны при запуске - их ссылки назначаются в качестве ключа для различных словарей (тысячи экземпляров словаря). Я понимаю, что константные строки интернированы - многократная ссылка на константную строку не увеличивает потребляемую память более чем на размер токена метаданных, указывающего на смещение в таблице интернированных строк.

Я понимаю, что строки const компилируются в сборку и, таким образом, влияют на размер скомпилированной сборки.


В какое точное время / событие эти строки const потребляют память времени выполнения?

Будет ли вся память, необходимая для всех строк const, взятых во время загрузки сборки, или это задерживается до тех пор, пока класс не будет скомпилирован JIT?

Можем ли мы уменьшить потребление памяти после запуска, изменив что-то в уравнении? (сделать поля неконстантными, сделать строки статическими полями?).

Давайте предположим, что приложение Winforms (.NET 2.0).

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Константные строки являются литералами времени компиляции, и, поскольку CLR использует для этого интернирование, они будут оставаться там до тех пор, пока приложение живо.

Вы также можете найти мой ответ на этот вопрос соответствующий.

0 голосов
/ 21 июля 2010

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

Когда вы используете константы в вашем коде, компилятор заменит их ссылкой на буквальную строку.

Строковые литералы загружаются вместе со сборкой, поэтому они сохраняются в течение всего срока службы приложения. Даже если вы измените свои константы на что-то другое, строковые литералы все еще там. Использование переменных вместо констант будет фактически использовать больше памяти, потому что ему нужно где-то хранить значение переменной (то есть копию ссылки на литеральную строку).

0 голосов
/ 21 июля 2010

Возможно, я ошибаюсь, но при первом обращении к сборке она загружается полностью в память со всем кодом, метаданными и постоянными значениями (я не знаю точно, загружены или отложены встроенные ресурсы).И он останется загруженным, пока процесс не будет остановлен

...