This question already has answers here:
How to measure the total memory consumption of the current process programmatically in .NET?

(4个答案)


7年前关闭。




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

我想知道这个Java函数的C#等效项:
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted()

代表为堆分配的的总内存。我需要此信息才能知道为C#程序分配的内存总大小。

然后在Java中,我可以通过以下方式获得使用的内存:
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()

目前,我在C#中使用它来获取已使用的内存:
Process_Memory = MyProcess.PrivateMemorySize64;

但是我不能完全确定是否等同。

因此,在简历中,如何在时间t处获取C#应用程序的总分配空间和当前使用空间?

编辑:

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

当前正在使用的内存
System.GC.GetTotalMemory(false);



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

看起来 :
MyProcess.PrivateMemorySize64; // return ~=25MB

或者
MyProcess.WorkingSet64;  //return ~=20MB

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



对于全局分配的内存, this article建议使用:
Process_MemoryEnd1 = MyProcess.VirtualMemorySize64;

它在程序中返回的值始终与始终相同,与Java相比大约为169MB,这似乎是公平的:最大64MB至170MB

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

最佳答案

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

您大概在GC.GetTotalMemory()之后。

编辑:

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

Process.GetCurrentProcess().WorkingSet64;

关于c# - 如何使用C#来衡量内存使用情况(就像我们在Java中那样)? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9404946/

10-14 12:09
查看更多