如何使用C#测量内存使用情况(就像我们在Java中可以做的那样)?

2022-09-03 01:03:17

我试图在C#程序中测量内存使用情况。

我想知道这个Java函数的C#等效物:

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

表示为堆分配的总内存。我需要这个来知道为我的C#程序分配的内存的总大小。

然后在Java中,我可以通过以下方式获取已用的内存:

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

目前,我在C#中使用它来获取已用内存:

Process_Memory = MyProcess.PrivateMemorySize64;

但我不完全确定它是否是等价的。

那么在简历中,我如何获得为我的C#应用程序分配的总空间和T次的当前使用情况

编辑:

从答案和进一步的研究,我确定了这一点:

当前使用的内存

System.GC.GetTotalMemory(false);

给出当前在托管内存中分配的字节数。(http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

此方法返回一个较低的值,我很确定它并不是所有正在使用的内存的表示形式,因为我可以在Java中获得。在java中,同一应用程序使用的内存从5MB开始,最大为125MB。使用C#,我使用上述方法从1到5 MB。getUsed()

看来:

MyProcess.PrivateMemorySize64; // return ~=25MB

MyProcess.WorkingSet64;  //return ~=20MB

为正在使用的所有内存提供更准确的值。但我不知道我应该使用哪一个...

对于全局分配的内存本文建议使用:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64;

它沿着程序始终返回相同的值,大约169MB,与Java相比似乎很公平:从64MB到170MB最大

我仍然在寻找一个准确的答案,我发现所有我发现的都非常模糊,我不是很熟悉Windows内存管理,我真的不确定是否理解我发现的文档:/


答案 1

以下是使用 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"));

答案 2

静态类提供所有此类信息。GC

您可能在 .GC.GetTotalMemory()

编辑:

我相信尝试根据当前扎根的对象来锻炼您的内存足迹。如果要为进程分配总大小(即包括空闲缓冲区),请使用该类,例如:Process

Process.GetCurrentProcess().WorkingSet64;