Подтвердить что ты не робот

Область памяти .NET EXE

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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