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

如何使用C#测量内存使用率(就像我们在Java中所做的那样)?,c#,java,memory,memory-management,C#,Java,Memory,Memory Management,我试图在C#程序中测量内存使用情况 我想知道这个Java函数的C#等价物: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 表示为堆分配的总内存。我需要这个来知道为我的C#程序分配的内存的总大小 然后在Java中,我可以通过以下方式获得已使用的内存: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 目前,我在C#

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

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

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted()
表示为堆分配的总内存。我需要这个来知道为我的C#程序分配的内存的总大小

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

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()
目前,我在C#中使用它来使用内存:

Process_Memory = MyProcess.PrivateMemorySize64;
但我不能完全确定它是否是等效的

那么,在resume中,我如何获得C#应用程序的总分配空间以及t时刻的当前使用情况

编辑:

通过回答和进一步研究,我确定:

当前正在使用的内存

给出当前在托管内存中分配的字节数。()

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

似乎:

MyProcess.PrivateMemorySize64; // return ~=25MB

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

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

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64;
在整个程序中,它返回的值总是相同的,大约169MB,与Java相比似乎是公平的:从64MB到170MB


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

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

您可能在
GC.GetTotalMemory()之后使用

编辑:

我相信它会尝试根据当前根对象计算内存占用。 如果需要为进程分配的总大小(即包括空闲缓冲区),请使用
进程
类。e、 g:

Process.GetCurrentProcess().WorkingSet64;

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

是的,我知道这一点,但它给出了托管堆中对象的实际大小,这是一个很低的值。我不认为这代表了所有分配的内存。那么我相信如果您想要原始分配内存(即,不考虑任何托管GC功能),您只需要使用
进程
类的所有这些属性
PagedMemorySize64
PrivateMemorySize64
,等等。谢谢,所以我想如果我只需要processus总分配内存
PrivateMorySize64
就足够了。我不知道什么是分页内存…这是一个边缘案例。如果物理RAM已满,操作系统将使用硬盘的一块作为“内存”,称为“虚拟内存”。所以,如果你真的很迂腐,想要总数,你真的应该把它们加起来,以防万一。我不确定
WorkingSet64
是否考虑了虚拟内存。MSDN说“WorkingSet64:获取为关联进程分配的物理内存量”。好的,我想要添加的总分配内存
NonpagedSystemMemorySize64
+
PagedMemorySize64
+
PagedSystemMemorySize64
+
PrivateMorySize64
+
感谢您的回答。因此,正如文档所说,
GC.GetTotalMemory(false)
返回当前在托管内存中分配的字节数。我认为它可能相当于java中的getUse()。但是我如何分配整个空间呢?`System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64`是否表示该值?对于第二个解决方案,它引发了一个
System.InvalidOperationException
@alain.janinm,不确定原因。在我的系统上工作。错误或内部异常是什么意思?Heu问题是VS用法语给出了错误,所以我将尝试翻译:无法加载计数器名称的数据,因为从寄存器读取的索引“”无效。使用基于GC的方法,我得到了非常不一致的数字(顺序为16x)对于相同的代码块。通过添加
GC.Collect()
GC.WaitForPendingFinalizers()在此之前,我能够获得更一致的测量结果。
    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.");         
    }
PerformanceCounter performanceCounter = new PerformanceCounter();

performanceCounter.CategoryName = "Process";

performanceCounter.CounterName = "Working Set";

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

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