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

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

【问题讨论】:

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

标签: c# memory-management


【解决方案1】:

你可以使用:

Process proc = Process.GetCurrentProcess();

获取当前进程并使用:

proc.PrivateMemorySize64;

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

【讨论】:

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

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

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

【讨论】:

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

System.EnvironmentWorkingSet- 一个 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

  1. 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);
    }
    
  2. 或者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();
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多