Почему .NET резервирует столько памяти для моего приложения? - PullRequest
5 голосов
/ 12 марта 2012

Когда я запускаю свое приложение, в профилировщике я вижу, что он использует около 80 МБ памяти (общее количество принятых байтов, счетчик производительности). Но когда я смотрю на размер выделенной памяти, он превышает 400 МБ!

Итак, мой вопрос: почему .NET резервирует так много памяти для моего приложения? Это нормально?

Ответы [ 4 ]

7 голосов
/ 12 марта 2012

Вы должны прочитать Тайна памяти .У меня были подобные вопросы некоторое время назад, и я перестал задавать себе вопросы после прочтения этого.Я читаю другие источники, но не могу найти сейчас, использую ключевые слова "необоснованное выделение памяти ОС Windows".В двух словах, ОС дает больше, чем требуется вашему приложению, в зависимости от физически доступных ресурсов памяти, например, если вы запускаете свое приложение на двух машинах с разной оперативной памятью, можно гарантировать, что на обеих этих машинах будет разное распределение памяти

1 голос
/ 12 марта 2012

Как вы, несомненно, знаете, существует огромная разница между используемой и выделенной памятью. Выделенная память приложения не означает, что она фактически используется где-либо; все, что на самом деле означает, - то, что ОС «пометила» зону виртуальной памяти (а именно - виртуальную), готовую для использования приложением.

Память не обязательно используется или истощает другие процессы - она ​​просто может , если приложение начнет ее заполнять.

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

Этот принцип аналогичен тому, который гласит, что хорошей практикой является создание, скажем, List<T> с разумной начальной емкостью, которая будет означать, что может быть добавлено приличное количество элементов, прежде чем потребуется изменение размера. ОС использует тот же подход с использованием памяти.

0 голосов
/ 12 марта 2012

Программное обеспечение довольно часто отправляет один большой запрос памяти основной операционной системе, а затем внутренне управляет собственным использованием выделенного блока памяти. Фактически, настолько распространенный, что диспетчер памяти Windows (и других операционных систем) явно поддерживает концепцию, называемую «незафиксированная память» - память, запрошенная процессом, но еще не использованная. Эта память на самом деле не существует , поскольку биты занимают пространство на ваших микросхемах DRAM, пока процесс фактически не использует ее. Предварительное распределение памяти фактически ничего не стоит.

Приложения делают это по многим причинам - хотя в основном это делается из соображений производительности. Приложение со знанием своих собственных шаблонов использования памяти может оптимизировать свой распределитель для этого шаблона; аналогично, по причинам локальности адресов, поскольку последовательные запросы памяти от ОС не всегда будут «соседствовать» друг с другом в памяти, что может повлиять на производительность кэша ЦП и даже может помешать вам использовать некоторые оптимизации.

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

0 голосов
/ 12 марта 2012

«Резервирование» памяти ни в коем случае не такое же, как «выделение» оперативной памяти.Прочитайте посты, на которые ссылаются Стив и Кришна.

Часть, на которую должен смотреть ваш клиент, это Private Bytes.Но даже это не совсем точное число, так как части вашего приложения могут быть перенесены на виртуальный диск.

Короче говоря, если ваш раздел «Частные байты» не очень хорошо контролируется ИЛИ у вас есть утечки (то есть: нераспределенные неуправляемые ресурсы), вы (и ваш клиент) должны игнорировать это и позволить ОС управлять тем, что выделено, чтов физической памяти и что выгружается на диск.

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