如何在 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 中获取缓存和释放的物理内存量?的主要内容,如果未能解决你的问题,请参考以下文章

linux中手动释放缓存的方法

Windows系统更新缓存删除未释放空间?

如何在Linux操作系统中手工释放内存缓存

Swap交换分区--continue

linux内存管理及手动释放机制

iOS 7 Sprite Kit 释放内存