Противоречивые отчеты об общем использовании памяти процесса в приложении C# Winforms - PullRequest
8 голосов
/ 25 мая 2020

РЕДАКТИРОВАТЬ: Срок действия награды истек, но если сообщество захочет наградить ее кому-то, я выбираю Рафул Чизкиягу.


У меня утечка памяти в одном из мои программы C# Winforms, и я хотел бы построить график использования памяти с течением времени, чтобы лучше понять, что может быть причиной утечки. Проблема в том, что ни одна из обычных команд c диагностики памяти не соответствует тому, что диспетчер задач объявляет потребляемой памятью для этого процесса. Я предположил, что это, возможно, было связано с тем, что приложение, использующее небезопасный / неуправляемый код, не было включено в общее количество. использование памяти в реальном времени. Я использую 5 ярлыков, каждая из которых имеет различные функции (в основном это отсюда ): Environment.WorkingSet, GC.GetTotalMemory(false), GC.GetTotalMemory(true), Process.GetCurrentProcess().PrivateMemorySize64 и Process.GetCurrentProcess().WorkingSet64.

Удивительно ( или, может быть, нет, вздох), я все еще не могу сопоставить ни одно из этих пяти чисел с диспетчером задач Windows 10. Вот скриншот:

pic

Итак, в основном я ищу это число 5,1 МБ. Как мне незаметно извлечь этот скрытый номер из фреймворка. NET?

Вот код, который у меня есть в функции таймера:

private void timer1_Tick(object sender, EventArgs e)
{
    //Refresh();
    label1.Text = "Environment.WorkingSet: " +  Environment.WorkingSet ;
    label2.Text = "GC.GetTotalMemory(false): " +    GC.GetTotalMemory(false) ;
    label3.Text = "GC.GetTotalMemory(true): " + GC.GetTotalMemory(true) ;
    Process proc = Process.GetCurrentProcess();
    label4.Text = "proc.PrivateMemorySize64: " +    proc.PrivateMemorySize64 ;
    label5.Text = "proc.WorkingSet64: " +       proc.WorkingSet64 ;
    proc.Dispose();
}

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


РЕДАКТИРОВАТЬ: Срок действия награды истек, но если сообщество желает наградить ее кому-то, я выбираю Рафул Чизкияху.

Ответы [ 4 ]

1 голос
/ 03 июня 2020

Я заметил, что инструменты отладки Visual Studio в большинстве случаев сообщают о более высоком использовании памяти, чем диспетчер задач, в то время как диспетчер задач сообщает только об использовании ОЗУ, инструменты отладки в VS будут учитывать все, например файлы подкачки ... и т. Д. c

думаю они будут надежнее

1 голос
/ 03 июня 2020

Диспетчер задач windows показывает только ту память, которая фактически находится в ОЗУ, а память процесса включает страницы (на диске), по которым память процесса может быть больше фактической ОЗУ на вашем компьютере

1 голос
/ 28 мая 2020

Диспетчер задач не дает вам "точное" использование ОЗУ. Попробуйте использовать Visual Studio Diagnosti c Tools или resourcemonitor

Однако, чтобы получить точное использование памяти, я думаю, что этот код будет работать

using System.Diagnostics;
// This obtains the current application process
Process thisProcess = Process.GetCurrentProcess();

// This obtains the memory used by the process
long usedMemory = thisProcess.PrivateMemorySize64;

// This will display the memory used by your C# app
 label6.Text= System.Convert.ToString(usedMemory)

Я предполагал, что ваша следующая метка будет быть "label6". Измените его, если вы добавили больше меток.

Надеюсь, это поможет :)

РЕДАКТИРОВАТЬ: Если вы разделите «usedMemory» на 2850023,23, вы можете получить значение, примерно равное память, отображаемая в диспетчере задач.

// This obtains the current application process
        Process thisProcess = Process.GetCurrentProcess();

        // This obtains the memory used by the process
        long usedMemory = thisProcess.PrivateMemorySize64;

        // 3. This will display the memory used by your C# app
        label6.Text = System.Convert.ToString(usedMemory/ 2850023.23);
0 голосов
/ 02 июня 2020

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

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

Снимок нужно делать при запуске приложения, а затем через последующие промежутки времени. Если объем памяти увеличивается медленно, вам придется немного подождать между каждым снимком. Затем вы можете сравнить снимки. Этот метод позволяет анализировать и сравнивать выделение объектов, количество объектов и даже неуправляемую память.

Microsoft написала руководство для инструмента использования памяти, интегрированного в Visual Studio . В большинстве случаев этого должно быть достаточно для определения утечки.

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

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