Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中获得可用或使用的内存#_C#_Memory Management - Fatal编程技术网

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

C# 如何在C中获得可用或使用的内存#,c#,memory-management,C#,Memory Management,如何获取应用程序使用的可用RAM或内存 - 一个64位有符号整数,包含映射到进程上下文的物理内存字节数 如果您想了解更多详细信息,可以使用以下方法进行设置。您可以使用: Process proc = Process.GetCurrentProcess(); 要获取当前流程并使用: proc.PrivateMemorySize64; 获取私有内存使用情况。有关详细信息,请参阅。您可能需要检查该方法 它检索当前认为由垃圾收集器分配的字节数。查看详细信息 private PerformanceCo

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

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

如果您想了解更多详细信息,可以使用以下方法进行设置。

您可以使用:

Process proc = Process.GetCurrentProcess();
要获取当前流程并使用:

proc.PrivateMemorySize64;

获取私有内存使用情况。有关详细信息,请参阅。

您可能需要检查该方法

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

查看详细信息

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 Framework作为参考

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
除了用户的回答和评论外,您最好在使用后处理返回的
过程

因此,为了处理
进程
,您可以使用
作用域或调用返回的进程(
proc
变量)上的
dispose
将其包装在

  • 使用
    范围:

    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();
    

  • 现在您可以使用
    内存
    变量,该变量被转换为兆字节。

    但只能在托管堆中使用。Arkain的回答应该同时给出本机堆和托管堆。应该注意的是,调用GetCurrentProcess本身将分配相当多的资源。完成后对返回的进程调用Dispose,或将整个代码包装在“使用”作用域中。命名空间:System.Diagnostics程序集:System(在System.dll中)我还要补充一点,在调用Refresh()之前,PrivateMemorySize64属性(+其他属性)本身不会自动更新。(在上面的链接页面上提到了它。)请参阅其他类似问题以获得更多答案:@ScottRhee如果我错了请纠正我-但我要补充的是,在调用
    GetCurrentProcess
    时,属性值是“最新的”,但只有在访问属性之前执行其他操作时才需要刷新。-备注:创建进程快照时,属性是正确的。您应该查看该类。注意,当前使用的物理RAM是工作集,分配的内存分为专用或共享字节(取决于分配的类型)。注意:1 MB是2^20,而不是1e+6 1备注。在C#
    中^
    是按位异或,而不是幂。所以只需使用
    proc.privatemorysize64/(1024*1024)
    ,或者
    proc.privatemorysize64/(1你漏了括号,应该是
    proc.privatemorysize64/(1024*1024)
    ,因为乘法比除法更重要。@LaurynasLazauskas我已经更新了答案。谢谢。你能(或者其他人)吗请举例说明如何使用PerformanceCounter获取系统可用/已用内存?