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


Answers:


172

您可以使用:

Process proc = Process.GetCurrentProcess();

要获取当前流程并使用:

proc.PrivateMemorySize64;

获取专用内存使用率。有关更多信息,请参见此链接


52
应该注意的是,对GetCurrentProcess的调用本身将分配很多资源。完成后在返回的进程上调用Dispose,或将整个代码包装在“使用”范围内。
Mathias Lykkegaard Lorenzen 2014年

9
命名空间:System.Diagnostics程序集:系统(在System.dll中)
Enigma Plus

12
我还要补充一点,在调用Refresh()之前,PrivateMemorySize64属性(+其他属性)本身不会自动更新。(在上面的链接的页面中已提及。)
ScottRhee

1
看到其他类似的问题以获取更多答案:stackoverflow.com/questions/14032515/…–
Aaron D

1
@ScottRhee如果我错了,可以纠正我-但我要补充一点,在您调用时属性值是“最新的” GetCurrentProcess,但只有在访问属性之前执行其他操作时才需要刷新。来源 - 备注说这些属性在创建过程快照时是正确的。
tabjsina

38

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

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


12
但是仅在托管堆中。Arkain的答案应同时提供本机堆和托管堆。
Yaur


11

这里了解详情。

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使用率的实际值。在这里查看更多详细信息。


6

除了@JesperFyhrKnudsen的答案和@MathiasLykkegaardLorenzen的评论之外,您最好dispose返回Process在使用它后。

因此,为了处置Process,您可以将其包装在using作用域中或调用Dispose返回的进程(proc变量)。

  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转换为兆字节的变量。


3
注意:1 MB是2 ^ 20而不是1e + 6
Hylaean

1
一注。在C#中^是按位XOR,不是幂。因此,只要使用proc.PrivateMemorySize64 / (1024*1024),或proc.PrivateMemorySize64 / (1 << 20)
СергейРыбаков

您错过了括号,应该是proc.PrivateMemorySize64 / (1024 * 1024)因为乘法没有除法优先级。
Laurynas Lazauskas

@LaurynasLazauskas我已经更新了答案。谢谢。
艾哈迈德·帕扬

0

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

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.