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

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

205808 次浏览

系统。环境 具有 工作集- 包含映射到进程上下文的物理内存字节数的64位有符号整数。

进去。NET Core 3.0及更高版本(又名。NET 5和更高版本) ,您可以使用 GC.GetGCMemoryInfo获取关于 GC 堆使用的内存以及 GC 认为可用的内存数量的信息。.NET 内部 使用这些数据来计算内存压力。内存压力 被使用决定何时修剪系统。缓冲器。数组池。

你可使用:

Process proc = Process.GetCurrentProcess();

获取当前流程并使用:

proc.PrivateMemorySize64;

要获得私有内存使用情况,请查看 这个链接以获得更多信息。

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

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

详情请参阅 给你

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 使用率的实际值。详情请参阅 给你

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

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

除了 @ 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. Or Dispose method:

    var memory = 0.0;
    Process proc = Process.GetCurrentProcess();
    memory = Math.Round(proc.PrivateMemorySize64 / (1024*1024), 2);
    proc.Dispose();
    

Now you could use the memory variable which is converted to Megabyte.