Объем памяти .NET EXE - PullRequest
       11

Объем памяти .NET EXE

21 голосов
/ 22 октября 2008

Даже простое Блокнот приложение в C # потребляет мегабайты оперативной памяти, как видно в диспетчере задач. При сворачивании приложения объем памяти в диспетчере задач значительно уменьшается и восстанавливается при максимальном использовании приложения.

Я где-то читал, что процесс .NET заранее резервирует много памяти для выделения времени выполнения. Вот почему .NET-приложения имеют больший объем памяти для начала. Но эта память может быть освобождена с помощью вызовов Win32 API. Компромисс в том, что распределение времени выполнения становится медленным - это правда?

Ответы [ 3 ]

34 голосов
/ 22 октября 2008

Причиной большого объема памяти является то, что JIT-компилятор и Windows Forms загружаются вместе с вашим процессом. Чтобы уменьшить это, вы можете сделать следующее:

[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);

static void MinimizeFootprint()
{
    EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}

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

24 голосов
/ 22 октября 2008

TaskManager не следует использовать для измерения объема памяти приложения .NET.

Когда приложение .NET запускается, оно запрашивает у ОС кусок памяти, который затем сегментируется, чтобы стать управляемой кучей, стеком и кучей больших объектов. Именно этот общий объем памяти, о котором сообщает TaskManager, может или не может быть полностью использован .NET. После того как приложению .NET будет выделен кусок памяти, оно не освободит его до тех пор, пока ОС не попросит об этом, что произойдет только с ОС, которая определит потребность в дополнительных ресурсах памяти.

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

Вы можете использовать код взаимодействия для вызова Win32 API, чтобы урезать размер вашего рабочего набора, но в следующий раз, когда ваше приложение запросит память у ОС, рабочий набор вернется обратно и произойдет падение производительности, пока ОС выделяет и передает дополнительной памяти, и среда выполнения .NET «настраивает» ее.

3 голосов
/ 22 октября 2008

Диспетчер задач не показывает реальное использование памяти для приложения .NET. Чтобы увидеть, что вам почти нужно поставить счетчик производительности в приложении или использовать профилировщик.

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

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