如何在 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 [重复]