如何在 Windows 7 中获取缓存和释放的物理内存量?
Posted
技术标签:
【中文标题】如何在 Windows 7 中获取缓存和释放的物理内存量?【英文标题】:How to get the amount of physical memory cached and free in Windows 7? 【发布时间】:2014-02-26 19:00:14 【问题描述】:我正在尝试在 C# 中模仿 Windows 7 任务管理器(仅限性能选项卡),虽然我设法获得了大多数值,但我无法获得物理内存的缓存和空闲字节值。我知道它们的定义是:
缓存是指最近用于系统资源的物理内存量。 空闲是当前未使用或不包含有用信息的内存量(与缓存文件不同,缓存文件包含有用信息)。
但是我的方法都没有导致任务管理器中显示的确切值。例如:
缓存:
PerformanceCounter PC4 = new PerformanceCounter();
PC4.CategoryName = "Memory";
PC4.CounterName = "Cache Bytes";
PC4.InstanceName = "";
Console.WriteLine((Int32)(PC4.NextValue() / (1024 * 1024)));
免费:
ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
ManagementObjectCollection results = searcher.Get();
object ob = 0;
foreach (ManagementObject result in results)
ob = result["FreePhysicalMemory"];
//returns physical memory's <i>Available</i> byte, NOT <i>Free</i>
我有什么遗漏吗?
【问题讨论】:
您在“缓存”括号中缺少更多计数器。像“备用缓存保留字节”。在 superuser.com 上询问这些是如何加起来的。 知道如何从 C# 的角度检索这些值吗? 【参考方案1】:您可以尝试查看 System.Diagnostics.Process 类。 我认为 Process.PagedMemorySize 是您感兴趣的。 下面的代码示例会列出正在运行的进程及其内存使用情况:
Process[] processlist = Process.GetProcesses();
foreach(Process p in processlist)
Console.WriteLine(“Process: 0 ID: 1 MEM:2”, p.ProcessName, p.Id, theprocess.PagedMemorySize);
如果 PagedMemorySize 不是一个尝试,可能是 VirtualMemorySize64
http://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx
【讨论】:
Process中有很多与内存相关的属性,我对它们都不熟悉,所以你应该检查一下 我尝试总结每个进程的 WorkingSet64, ,NonpagedSystemMemorySize64, VirtualMemorySize64, PagedMemorySize64 和 PrivateMemorySize64 的数量(最后两个实际上返回相同的数字)。它们都不对应于 Cached 或 Free ram。【参考方案2】:您需要添加对 Microsoft.VisualBasic 的引用才能使用以下内容:
using System.Runtime.InteropServices;
using Microsoft.VisualBasic.Devices;
public class MemStat
public ulong Available get; set;
public ulong Total get; set;
public ulong PhysicalMemoryInUse get; set;
public ulong Free get; set;
public ulong Cached get; set;
public MemStat()
ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
ManagementObjectCollection results = searcher.Get();
var Available = new ComputerInfo().AvailablePhysicalMemory;
this.Available = Available;
var Total = new ComputerInfo().TotalPhysicalMemory;
this.Total = Total;
var PhysicalMemoryInUse = Total - Available;
this.PhysicalMemoryInUse = PhysicalMemoryInUse;
Object Free = new object();
foreach (var result in results)
Free = result["FreePhysicalMemory"];
this.Free = ulong.Parse(Free.ToString());
var Cached = Total - PhysicalMemoryInUse - ulong.Parse(Free.ToString());
this.Cached = Cached;
然后像这样使用它:
ulong TotalMemory = new MemStat().Total;
ulong FreeMemory = new MemStat().Free;
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(" **** MY WINDOWS PROGRAM **** ");
Console.WriteLine("" + (TotalMemory/1024) + "K RAM SYSTEM " + FreeMemory + " BYTES FREE");
【讨论】:
以上是关于如何在 Windows 7 中获取缓存和释放的物理内存量?的主要内容,如果未能解决你的问题,请参考以下文章