Как измерить использование памяти с помощью С# (как мы можем это сделать на Java)?

Я пытаюсь измерить в программе С# использование памяти.

Я хотел бы знать эквивалент С# этой функции Java:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted()

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

Затем в Java я могу получить использованную память с помощью:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()

В настоящее время я использую это в С# для получения использованной памяти:

Process_Memory = MyProcess.PrivateMemorySize64;

Но я не совсем уверен, что это эквивалент.

Итак, в резюме, как я могу получить общее выделенное пространство для моего приложения С# и текущего использования в момент времени t?

EDIT:

Из ответов и дальнейших исследований я это определяю:

Текущая память в использовании

System.GC.GetTotalMemory(false);

Дайте количество байтов, которые в настоящее время выделены в управляемой памяти. (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

Этот метод возвращает низкое значение, и я уверен, что это не действительно представление всей используемой памяти, поскольку я могу получить с getUsed() в Java. В java для одного и того же приложения память начинается с 5 МБ и переходит на максимальный 125 МБ. С С# я получаю от 1 до 5 МБ с помощью вышеописанного метода.

Кажется, что

MyProcess.PrivateMemorySize64; // return ~=25MB

или

MyProcess.WorkingSet64;  //return ~=20MB

Дайте более точное значение всей используемой памяти. Но я не знаю, какой я должен использовать...

Для глобальной выделенной памяти в этой статье предлагается использовать:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64;

Он возвращает всегда одно и то же значение по программе, около 169 МБ, что кажется справедливым по сравнению с Java: от 64 МБ до 170 МБ макс

Я все еще ищу точный ответ, все, что я нашел, очень расплывчато, и я не очень хорошо разбираюсь в управлении памятью Windows, я не уверен, что возьму документы, которые я нашел:/

Ответ 1

Статический класс GC предоставляет весь этот тип информации.

Вероятно, после GC.GetTotalMemory().

EDIT:

Я верю, что пытается размахивать вашей памятью на основе существующих в настоящее время объектов. ЕСЛИ вы хотите, чтобы общий размер, выделенный для процесса (т.е. Включая свободный буфер), использовал класс Process. например:.

Process.GetCurrentProcess().WorkingSet64;

Ответ 2

Вот один из способов, используя GC:

    public void Test()
    {
        long kbAtExecution = GC.GetTotalMemory(false) / 1024;

        // do stuff that uses memory here 

        long kbAfter1 = GC.GetTotalMemory(false) / 1024;
        long kbAfter2 = GC.GetTotalMemory(true) / 1024;

        Console.WriteLine(kbAtExecution + " Started with this kb.");
        Console.WriteLine(kbAfter1 + " After the test.");
        Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added.");
        Console.WriteLine(kbAfter2 + " Amt. After Collection");
        Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");         
    }

Или, альтернативно, используя System.Diagnostics.PerformanceCounter, чтобы получить информацию о рабочем наборе:

PerformanceCounter performanceCounter = new PerformanceCounter();

performanceCounter.CategoryName = "Process";

performanceCounter.CounterName = "Working Set";

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName;

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0"));