如何在C#中获取可用或已使用的内存

177

如何获得应用程序可用的RAM内存或已使用的内存?


1
你应该看一下 System.Diagnostics.Process 类。 - Ronald Wildenberg
3
注意,当前使用的物理内存是工作集,分配的内存根据分配类型分为私有或共享字节。 - Richard
6个回答

214

你可以使用:

Process proc = Process.GetCurrentProcess();

获取当前进程并使用:

proc.PrivateMemorySize64;
为了获取私有内存使用情况,请参考此链接

65
需要注意的是,调用GetCurrentProcess本身会分配相当多的资源。在完成后调用返回进程的Dispose方法,或将整个代码包装在“using”范围内。 - Mathias Lykkegaard Lorenzen
11
命名空间:System.Diagnostics 程序集:System(位于System.dll中) - Enigma Plus
14
我想补充一点,PrivateMemorySize64属性(以及其他属性)本身不会自动更新,直到调用Refresh()方法为止。(这在上面链接的页面中有提到。) - ScottRhee
1
请参考以下类似问题以获取更多答案:https://dev59.com/qWYr5IYBdhLWcg3wAFg0 - Aaron D
1
@ScottRhee 如果我说错了,请纠正我 - 我会补充一下,即属性值在调用GetCurrentProcess时是“最新的”,但只有在访问属性之前进行其他操作时才需要刷新。来源 - 备注中说,属性在创建进程快照的时候是正确的。 - tabjsina
显示剩余2条评论

45

你可能需要检查GC.GetTotalMemory方法。

该方法检索垃圾收集器当前认为已分配的字节数。


21
仅限于托管堆。Arkain的回答应该包括本机堆和托管堆。 - Yaur

34

System.Environment 包含 WorkingSet 属性,该属性是一个64位有符号整数,包含映射到进程上下文的物理内存字节数。

在 .NET Core 3.0 及更高版本(即 .NET 5 及更高版本)中,您可以使用 GC.GetGCMemoryInfo 来获取有关 GC 堆使用的内存和 GC 认为可用的内存量的信息。 .NET 内部使用此数据来计算内存压力。内存压力用于决定何时修剪 System.Buffers.ArrayPool。


你能否(或其他任何人)举个例子来演示如何使用PerformanceCounter获取系统可用/已用内存? - The Elemental of Destruction
我删除了对PerformanceCounter的引用,因为它没有帮助。我添加了一些关于GC.GetGCMemoryInfo的信息,这可能更有用。 - Austin
请注意,您需要调用Process.Refresh()以获取更新后的值。 - Mike S

22
除了@JesperFyhrKnudsen的回答和@MathiasLykkegaardLorenzen的评论之外,你最好在使用后dispose返回的Process

  • 所以,为了处理Process,你可以将其包装在using范围内,或者在返回的进程(proc变量)上调用Dispose

  • using范围:

  • var memory = 0.0;
    using (Process proc = Process.GetCurrentProcess())
    {
        // The proc.PrivateMemorySize64 will returns the private memory usage in byte.
        // Would like to Convert it to Megabyte? divide it by 2^20
           memory = proc.PrivateMemorySize64 / (1024*1024);
    }
    
  • 或者 Dispose 方法:

    var memory = 0.0;
    Process proc = Process.GetCurrentProcess();
    memory = Math.Round(proc.PrivateMemorySize64 / (1024*1024), 2);
    proc.Dispose();
    
    现在您可以使用已转换为兆字节的“memory”变量。

  • 3
    注意:1MB等于2的20次方,而不是1e+6。 - Hylaean
    3
    注意,在C#中,符号“^”表示按位异或,而不是乘方。因此,请直接使用“proc.PrivateMemorySize64 / (1024*1024)”或“proc.PrivateMemorySize64 / (1 << 20)”来计算私有内存大小。 - Сергей Рыбаков
    1
    你错过了括号,应该是 proc.PrivateMemorySize64 / (1024 * 1024),因为乘法没有比除法优先级高。 - Laurynas Lazauskas
    @LaurynasLazauskas 我已经更新了答案。谢谢。 - AhmadReza Payan

    14

    详情请点击此处

    private PerformanceCounter cpuCounter;
    private PerformanceCounter ramCounter;
    public Form1()
    {
        InitializeComponent();
        InitialiseCPUCounter();
        InitializeRAMCounter();
        updateTimer.Start();
    }
    
    private void updateTimer_Tick(object sender, EventArgs e)
    {
        this.textBox1.Text = "CPU Usage: " +
        Convert.ToInt32(cpuCounter.NextValue()).ToString() +
        "%";
    
        this.textBox2.Text = Convert.ToInt32(ramCounter.NextValue()).ToString()+"Mb";
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
    }
    
    private void InitialiseCPUCounter()
    {
        cpuCounter = new PerformanceCounter(
        "Processor",
        "% Processor Time",
        "_Total",
        true
        );
    }
    
    private void InitializeRAMCounter()
    {
        ramCounter = new PerformanceCounter("Memory", "Available MBytes", true);
    
    }
    
    如果你获取的值为0,则需要调用 NextValue() 两次。然后它将给出CPU使用情况的实际值。更多细节请参见这里

    0

    对于完整的系统,您可以将Microsoft.VisualBasic框架添加为引用;

     Console.WriteLine("You have {0} bytes of RAM",
            new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
            Console.ReadLine();
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接