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

Posted

技术标签:

【中文标题】如何在 C# 中获取可用或使用的内存【英文标题】:How to get memory available or used in C# 【发布时间】:2010-10-19 12:45:35 【问题描述】:

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

【问题讨论】:

你应该看看System.Diagnostics.Process类。 注意,当前使用的物理 RAM 是工作集,分配的内存分为私有或共享字节(取决于分配的类型)。 【参考方案1】:

你可以使用:

Process proc = Process.GetCurrentProcess();

获取当前进程并使用:

proc.PrivateMemorySize64;

获取私有内存使用情况。更多信息请查看this link。

【讨论】:

应该注意,调用GetCurrentProcess 本身会分配相当多的资源。完成后在返回的进程上调用 Dispose,或将整个代码包装在“使用”范围内。 命名空间:System.Diagnostics 程序集:System(在 System.dll 中) 我还想补充一点,在调用 Refresh() 之前,PrivateMemorySize64 属性(+其他属性)本身不会自动更新。 (上面链接的页面上提到了。) 查看其他类似问题以获得更多答案:***.com/questions/14032515/… @ScottRhee 如果我错了,请纠正我 - 但我要补充一点,在您调用 GetCurrentProcess 时,属性值是“最新的”,但只需要在以下情况下刷新您在访问属性之前正在执行其他操作。 Source - 备注表示在创建进程快照时属性是正确的。【参考方案2】:

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

它检索当前认为由垃圾收集器分配的字节数。

【讨论】:

但仅在托管堆中。 Arkain 的回答应该同时提供原生堆和托管堆。【参考方案3】:

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

在 .NET Core 3.0 及更高版本(也称为 .NET 5 及更高版本)中,您可以使用 GC.GetGCMemoryInfo 获取有关 GC 堆使用的内存以及 GC 认为可用内存的信息。 .NET 内部 uses this data 来计算内存压力。内存压力is used 决定何时修剪 System.Buffers.ArrayPool。

【讨论】:

您(或其他人)能否举例说明如何使用 PerformanceCounter 获取系统可用/已用内存? 我删除了对 PerformanceCounter 的引用,因为它没有帮助。我添加了一些关于 GC.GetGCMemoryInfo 的信息,这可能更有用。【参考方案4】:

除了@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 变量。

【讨论】:

注意:一兆字节是 2^20 而不是 1e+6 一张便条。在 C# 中,^ 是按位异或,而不是幂。所以只需使用proc.PrivateMemorySize64 / (1024*1024),或proc.PrivateMemorySize64 / (1 << 20) 你错过了括号,应该是proc.PrivateMemorySize64 / (1024 * 1024),因为乘法不优先于除法。 @LaurynasLazauskas 我已经更新了答案。谢谢。【参考方案5】:

查看here了解详情。

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 使用率的实际值。查看更多详情here。

【讨论】:

【参考方案6】:

对于完整的系统,您可以添加 Microsoft.VisualBasic 框架作为参考;

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

【讨论】:

以上是关于如何在 C# 中获取可用或使用的内存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中增加堆栈大小? 1MB 是不够的。我有 32GB 的可用 RAM [重复]

如何在 C#(托管代码)中获取 *THREAD* 的 CPU 使用率和/或 RAM 使用率?

将变量存储在某个内存地址 C#

如何获取可用系统内存的大小?

如何在 C# 中获取音频/视频和捕获设备列表?

如何获取 Windows 中可用 COM 接口的列表